2015-08-25 2 views

ответ

14

Опция controllerAs: 'foo' выполняет следующие действия:

$scope.foo = new ctrl() 

Ваша директива Безразлично» T укажите scope, это означает, что ваша директива использует область действия от ее родителя ($parentScope). В вашем случае два экземпляра директивы используют одну и ту же родительскую область. Так что две директивы:

<directive name="1" /> 
<directive name="2" /> 

работы, как:

  1. <directive name="1" />: $parentScope.foo = new ctrl(). Внутри контроллера: $parentScope.foo.name = 1.
  2. <directive name="2" />: $parentScope.foo = new ctrl(). (экземпляр на шаге 1 перезаписывается). Внутри контроллера: $parentScope.foo.name = 2.

Итак, обе директивы относятся к тому же name, определенному на втором экземпляре контроллера.

Решение: использовать область изоляции как @Michelem mentions.

+2

Хорошее объяснение того, зачем нужна изолированная область, а не только то, что она необходима – charlietfl

3

Вы должны изолировать сферу:

JSFiddle

function directive() { 
    return { 
     scope: {name: '='}, 
     template: '{{foo.name}}', 
     controller: ctrl, 
     controllerAs: 'foo' 
    } 
} 

Посмотрите на @Joy answer для объяснения

+0

Но как я могу использовать изолированную область, когда я использую директиву атрибутов am в элементе 'input'? Я получил сообщение об ошибке: https://docs.angularjs.org/error/$compile/multidir – robsonrosa

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