这可能会让人感到困惑,但希望一个简单的例子可以澄清它。首先,让我们将模型绑定与行为分开。
这是一个有助于将事情联系在一起的小提琴:http://jsfiddle.net/jeremylikness/3pvte/
并解释......如果你的指令看起来像这样:
<my-directive target="foo"/>
那么你有这些范围的可能性:
{ target : '=' }
这会将 scope.target(指令)绑定到 $scope.foo(外部范围)。这是因为 = 用于双向绑定,当您不指定任何内容时,它会自动将内部范围的名称与指令上的属性名称匹配。对 scope.target 的更改将更新 $scope.foo。
{ bar : '=target' }
这会将 scope.bar 绑定到 $scope.foo。这是因为我们再次指定了双向绑定,但告诉指令属性“target”中的内容应该在内部范围中显示为“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 是:
<my-directive target='foo'>
然后
{ target : '=' }
将允许您从指令中调用 scope.target(1,2)。
同样的,
{ bar : '=target' }
允许您从指令中调用 scope.bar(1,2)。
更常见的方法是将其确立为一种行为。从技术上讲,& 符号在父级上下文中计算表达式。这很重要。所以我可以:
<my-directive target="a+b" />
如果父作用域有 $scope.a = 1 和 $scope.b = 2,那么在我的指令上:
{ target: '&' }
我可以调用 scope.target(),结果为 3。这很重要 - 绑定作为函数公开给内部作用域,但指令可以绑定到表达式。
更常见的方法是:
<my-directive target="foo(val1,val2)">
然后你可以使用:
{ target: '&' }
并从指令中调用:
scope.target({val1: 1, val2: 2});
这将获取您传递的对象,将属性映射到评估表达式中的参数,然后调用行为,本例调用 $scope.foo(1,2);
你也可以这样做:
<my-directive target="foo(1, val)"/>
这将第一个参数锁定到文字 1,并来自指令:
{ bar: '&target' }
然后:
scope.bar(5)
这将调用 $scope.foo(1,5);