2014-01-09 2 views
0

я директива, в которой у меня есть объем упоминается как:Можно ли заменить область для выделенной области?

 return { 
     restrict: 'AE', 
     transclude: true, 
     scope: { 
      model: '=', 
      menu: '=' 
     },} 

поэтому мой вопрос отдельно от модели и меню переменных, что все переменные доступны для меня? Изолированная область наследует переменные родительской области?

Если я не хочу использовать изолированную область, то что можно сделать, где я могу установить эти две переменные в директивах и наследует все переменные из родительской области?

спасибо.

+0

Почему вы хотите получить доступ ко всей ** переменной «области» контроллера и одновременно определить изолированную область? –

+0

http://jsbin.com/EyareCo/1/edit – KoIIIeY

ответ

1

Если я правильно понял, то, что вы хотите достичь, - это новая область, наследующая все родительские элементы. Это легко сделать.

По умолчанию директива использует родительский объем, но вы можете сделать две разные вещи:

scope: {} // Isolated scope 

или:

scope: true // new scope inheriting from parent 

Так с позже, вы будете иметь все родительская сфера имеет но вы можете установить там новый материал, и родитель не узнает. Пример:

http://plnkr.co/edit/oL5ALPvkEzkiXSuOSNnE?p=preview

Я надеюсь, что это то, что вы просили.

EDIT: Я отредактировал плункер.Идея с новыми областями, которые унаследованы от других является:

Если родитель имеет примитивный, как name ребенок унаследует его, но если вы делаете что-то вроде:

childScope.name = ".." вы не изменяете родитель name, вы затеняя его, AKA создает новый name, который скроет родителя name. это означает, что родитель никогда не узнает, изменил ли ребенок name.

foo - это то, что создано в новом детском пространстве, это означает, что родитель никогда не узнает.

user не является примитивным, он является объектом и, когда ребенок изменяет свой name, не затенять весь user, это просто изменение его значения:

childScope.user.name = "Fox"

Это получение user ссылается и изменяет его значение, не меняет весь user, так что вы не затеняете его. Если вы делаете:

childScope.user = { name: 'Foo' };

Затем вы создаете целую user, AKA вы создаете новую ссылку, так что будет тенью родителя user и родитель-потомок этого объекта будет конца.

Это то, что мы называем dot rule.

+0

Но если я обновляю некоторую переменную в области DSP-области, она также вносит изменения в родительскую область. или он вносит изменения в копию этой переменной, присутствующей в области chind. – IfOnly

+1

Я обновил свой ответ и plunk –

+0

Спасибо Иисусу, это очень полезно. Это устранило большинство моих сомнений. Еще раз спасибо. – IfOnly

0

Когда вы устанавливаете область как это, это изолированная область действия, и, как говорится в ее имени, она не наследует никакого свойства из родительской области.

Однако, вы можете непосредственно определить переменную на сферу, в методе директивы link, как это:

.directive('someDirective', function(){ 
    return { 
     restrict: 'C', 
     link: function(scope, element, attrs){ 
      scope.newVariable = "newVariable" 
     } 
    } 
} 

добавляет новаяПеременная к вашему scope.Hope это помогает ~

Более подробную информацию о directive можно посмотреть здесь, http://docs.angularjs.org/guide/directive. Существует раздел с именем Creating a Directive that Manipulates the DOM

1

Если scope свойства определения директивы устанавливается на { /* object hash */ }изолированной сферы создаются для вашей директивы. Если вы установили свойство scope в true, создается новая область, которая наследуется от родительской области.

Смотрите этот плункер для демонстрации на directive scope behaviour.

Если вы не хотите изолировать область действия, но хотите передать аргумент в директиву, вы можете использовать метод $ observ для attributes service.

function linkingFn(scope, elm, attrs, ctrl) { 
    // get the attribute value 
    console.log(attrs.ngModel); 

    // change the attribute 
    attrs.$set('ngModel', 'new value'); 

    // observe changes to interpolated attribute 
    attrs.$observe('ngModel', function(value) { 
    console.log('ngModel has changed value to ' + value); 
    }); 
} 

Создание два способа связывания без изолированного объема может быть сделано с $parse service.

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