在angular指令中,我知道我可以指定隔离范围,但我需要添加' ='或者' @'或者'&'在{}中定义变量,而我不必在链接中执行此操作,例如:
scope: {
foo:'=foo',
bar:'@bar'
}
这是有效的
link: function($scope, $element){
$scope.foo = 'foo';
$scope.bar = 'bar';
}
这也有效(链接功能在指令中)
scope: {
foo:'foo',
bar:'bar'
}
这不起作用!因为我没有添加' ='或者' @'或者'&'
所以我的问题是,链接中的$ scope应该与$ scope:{}相同,两者都是相同的隔离范围,但为什么我可以在链接中定义变量而不添加' ='或者' @'或者'&'?
感谢!!!
答案 0 :(得分:1)
使用link属性,您只需处理指令的隔离范围。使用scope属性,您可以定义如何将元素(在父作用域中)的属性导入隔离范围。它们用于不同的目的。
=,@和&前缀定义了在将属性导入隔离范围时如何解释属性:
modelParent:' = modelIsolate' - 通过在父作用域(modelParent)中定义的模型与隔离作用域(modelIsolate)上定义的模型之间建立双向模型绑定,将模型导入隔离的作用域。这里,指令的modelParent属性被解释为模型。
attrib1:' @ attrib1' - 通过将属性值作为字符串计算,将字符串导入隔离的作用域。该属性可以具有插值表达式。例如,如果您通过了“{{name}}'作为你的指令的一个属性,其名称绑定到詹姆斯'在父范围内,那么什么将被绑定到'attrib1'在你的孤立范围内将是$ scope.attrib1 ='你好詹姆斯'。当'名称'绑定变化(即从詹姆斯到迈克)然后' attrib1'在您的隔离范围内将自动更新。因此,@ binding有时被称为单向绑定。就个人而言,我喜欢将其视为支持插值的字符串。
表达:'& express' - 将表达式导入可在父作用域中计算的隔离作用域。这通常用于从指令的隔离范围内执行父范围中存在的函数。例如,如果您在父作用域中定义了一个单击处理程序:$scope.onclick = function() {};
并将其传递给指令:<directive attrib1="onclick" />
,则可以在指令中调用该函数:template:{{1} }。
所有三种方法都将范围变量从父范围导入隔离范围。但是,根据您希望如何解释指令属性,您将更喜欢其中一个。