为{}和link中的angular指令定义隔离范围变量之间的区别

时间:2014-06-25 05:23:57

标签: javascript angularjs angularjs-directive angularjs-scope

在angular指令中,我知道我可以指定隔离范围,但我需要添加' ='或者' @'或者'&'在{}中定义变量,而我不必在链接中执行此操作,例如:

 scope: {
   foo:'=foo',
   bar:'@bar'
 }

这是有效的

link: function($scope, $element){
  $scope.foo = 'foo';
  $scope.bar = 'bar';
}

这也有效(链接功能在指令中)

 scope: {
   foo:'foo',
   bar:'bar'
 }

这不起作用!因为我没有添加' ='或者' @'或者'&'

所以我的问题是,链接中的$ scope应该与$ scope:{}相同,两者都是相同的隔离范围,但为什么我可以在链接中定义变量而不添加' ='或者' @'或者'&'?

感谢!!!

1 个答案:

答案 0 :(得分:1)

使用link属性,您只需处理指令的隔离范围。使用scope属性,您可以定义如何将元素(在父作用域中)的属性导入隔离范围。它们用于不同的目的。

=,@和&前缀定义了在将属性导入隔离范围时如何解释属性:

  1. modelParent:' = modelIsolate' - 通过在父作用域(modelParent)中定义的模型与隔离作用域(modelIsolate)上定义的模型之间建立双向模型绑定,将模型导入隔离的作用域。这里,指令的modelParent属性被解释为模型。

  2. attrib1:' @ attrib1' - 通过将属性值作为字符串计算,将字符串导入隔离的作用域。该属性可以具有插值表达式。例如,如果您通过了“{{name}}'作为你的指令的一个属性,其名称绑定到詹姆斯'在父范围内,那么什么将被绑定到'attrib1'在你的孤立范围内将是$ scope.attrib1 ='你好詹姆斯'。当'名称'绑定变化(即从詹姆斯到迈克)然后' attrib1'在您的隔离范围内将自动更新。因此,@ binding有时被称为单向绑定。就个人而言,我喜欢将其视为支持插值的字符串。

  3. 表达:&#39;&amp; express&#39; - 将表达式导入可在父作用域中计算的隔离作用域。这通常用于从指令的隔离范围内执行父范围中存在的函数。例如,如果您在父作用域中定义了一个单击处理程序:$scope.onclick = function() {};并将其传递给指令:<directive attrib1="onclick" />,则可以在指令中调用该函数:template:{{1} }。

  4. 所有三种方法都将范围变量从父范围导入隔离范围。但是,根据您希望如何解释指令属性,您将更喜欢其中一个。