AngularJS : 指令作用域中 =、&和@有什么不同?
AngularJS : 指令作用域中 =、&和@有什么不同?
这个问题已经在这里有答案:
在指令中创建一个隔离作用域可以让我们将外部作用域映射到内部作用域。我们已经看到了六种不同的映射属性的方法:
- =attr
- &attr
- @attr
- =
- &
- @
每个作用域映射选项都做什么?
总结
- @attr绑定到匹配的DOM属性的计算后的字符串值。
- =attr绑定到匹配的DOM属性的作用域属性。
- &attr绑定到匹配的DOM属性的作用域函数。
- @
- =
- &
如果目标DOM属性的名称与隔离作用域属性名称相匹配,则使用4、5和6。以下是示例的可工作fiddle。
Html
Outer Scope
msg: {{ msg }}
Inner Scope
Javascript
angular.module('isolate', []) .directive('myDirective', function () { return { template: '' + '' + '' + '' + '' + '', scope: { myAt: '@at', myEquals: '=equals', myAmpersand: '&ersand', at: '@', equals: '=', ampersand: '&' } }; });
这可能会让人感到困惑,但是希望一个简单的例子可以澄清它。首先,让我们将模型绑定与行为分开。
这里有一个示例可以帮助您把事情联系起来:http://jsfiddle.net/jeremylikness/3pvte/
并且解释...如果您的指令像这样:
那么您有以下几种作用域选择:
{ target : '=' }
这将把scope.target(指令)绑定到$scope.foo(外层作用域)上。这是因为=表示双向绑定,而当您没有指定任何内容时,它会自动将内部作用域的名称与指令上的属性名称相匹配。更改scope.target将更新$scope.foo。
{ bar : '=target' }
这将将scope.bar绑定到$ scope.foo上。这是因为再次指定了双向绑定,但是告诉指令“目标”属性中的内容应该出现在内部作用域中作为“bar”。更改scope.bar将更新$scope.foo。
{ target : '@' }
这将将scope.target设置为“foo”,因为@表示“按照字面意思”。更改scope.target不会传播到指令外部。
{ bar : '@target' }
这将将scope.bar设置为“foo”,因为@取自目标属性的值。更改scope.bar不会传播到指令外部。
现在让我们谈谈行为。假设您的外部作用域为:
$scope.foo = function(parm1, parm2) { console.log(parm1 + ": " + parm2); }
您有几种方法可以访问此项。如果您的HTML如下:
那么
{ target : '=' }
将允许您从指令中调用scope.target(1,2)。
同样的事情,
{ bar : '=target' }
允许您从指令中调用scope.bar(1,2)。
更常见的方法是将其建立为行为。从技术上讲,&符号在父级上下文中评估表达式。这很重要。所以我可以有:
如果父级作用域具有$scope.a = 1和$scope.b = 2,那么在我的指令中:
{ target: '&' }
我可以调用作用域target()而结果将是3。这很重要 - 绑定作为函数公开给内部范围,但指令可以绑定到表达式。
更常见的方法是:
然后您可以使用:
{ target: '&' }
并从指令中调用:
scope.target({val1: 1, val2: 2});
这将接受您传递的对象,将其属性映射到评估表达式中的参数,然后调用行为,例如调用$scope.foo(1,2);
您也可以这样做:
这将锁定第一个参数为文字1,然后从指令中:
{ bar: '&target' }
然后:
scope.bar(5)
这将调用$scope.foo(1,5);