2013-11-02 5 views
1

Лучший способ описать мою проблему - демонстрация. Это, как я хочу, чтобы моя директива будет использоваться:Angularjs Manual Двусторонняя привязка

<my-directive my-attr="{'property': obj}"></my-directive> 

Где OBJ 'является объектом сферы, что я хочу двухсторонняя обязательным. Уловка также мне нужно получить имя объекта «obj».

Частичное решение, с которым я столкнулся, состояло в том, чтобы передать имя объекта ('obj') в виде строки и использовать $ parse для получения объекта. Но когда это не влияет на область $ parent таким же образом, используя scope '='. Как я могу вручную записать двустороннюю привязку, чтобы изменения объекта в моей области изменили объект на родительские области?

+0

Почему просто поместите 'obj.name = 'thename'' и используйте' my-attr = "obj" '? –

ответ

-1

мне удалось решить мою проблему. Мое решение (в CoffeeScript):

$scope.$watch name, (val) -> 
    scope = $scope.$parent 
    # look up the scopes until the real object is found 
    while scope isnt null 
    if not scope.hasOwnProperty(name) 
     scope = scope.$parent 
    else 
     expressions[name].assign(scope, val) 
     scope = null 

Это проверит цепочку областей и найти тот, что объект определен на и изменить его там. Я считаю, что это почти идентичное поведение с использованием scope: '=' в определении директивы.

0

Можно использовать этот синтаксис объекта:

scope[ attrs.myAttr] 

для доступа к родительской области собственности, так как вы не используете изолированную сферу в директиве

+0

Извините, я должен был уточнить, я использую изолированный объем. –

+0

, если вы используете изолированную область действия с '=' в своей изолированной области и создаете тот же атрибут в mrkup. Создайте демонстрацию в jsfiddle.net или plunker, которая показывает вашу проблему. – charlietfl

+0

Я интерпретировал, что вы пытались избежать использования '=' и, следовательно, пытались избежать изолированной области. – charlietfl

1

После некоторого исследования, и со ссылкой на following issue, вот расширение Scope, что позволяет связыванию двухстороннего (это, по существу, Угловой код, только модифицирована для работы за пределами nodeLinkFn):

angular.module('scopeBindExtention', []) 

.run([ '$rootScope', '$parse', function($rootScope, $parse) { 

    var extended = angular.extend($rootScope, {}); 

    extended.$bindTwoWay = function(scopeName, parentName) { 
     var scope  = this, 
      parentScope = scope.$parent; 
      lastValue, 
      parentGet, 
      parentSet, 
      compare; 

     parentGet = $parse(parentName); 
     if (parentGet.literal) { 
      compare = angular.equals; 
     } else { 
      compare = function(a,b) { return a === b; }; 
     } 
     parentSet = parentGet.assign || function() { 
      // reset the change, or we will throw this exception on every $digest 
      lastValue = scope[scopeName] = parentGet(parentScope); 
      throw new Error("Expression '" + parentName + "' is non-assignable!"); 
      /* 
      throw $compileMinErr('nonassign', 
       "Expression '{0}' is non-assignable!", 
       parentName); 
      */ 
     }; 
     lastValue = scope[scopeName] = parentGet(parentScope); 
     var unwatch = parentScope.$watch($parse(parentName, function parentValueWatch(parentValue) { 
      if (!compare(parentValue, scope[scopeName])) { 
      // we are out of sync and need to copy 
      if (!compare(parentValue, lastValue)) { 
       // parent changed and it has precedence 
       scope[scopeName] = parentValue; 
      } else { 
       // if the parent can be assigned then do so 
       parentSet(parentScope, parentValue = scope[scopeName]); 
      } 
      } 
      return lastValue = parentValue; 
     }), null, parentGet.literal); 
     scope.$on('$destroy', unwatch);  
    } 

}]); 

Клиентам следует только позвонить:

scope. $ BindTwoWay ('childModelName', 'parentModelName');

+0

Вы работали над своим решением более подробно, потому что в настоящее время я реализую 'scope. $ BindTwoWay ('FormErrors', 'viewModel.errors');', где 'viewModel' является именем контроллера несколько' $ parent''s а не ваш код, ни метод '$ parse', ни' $ eval' возвращают мне значение, кроме 'undefined', как будто ссылка не существует? – skmasq

Смежные вопросы