AngularJS中的&、@和=有什么区别?
AngularJS中的&、@和=有什么区别?
我非常新手 AngularJS。有人可以用适当的示例为我解释这些 AngularJS 运算符之间的区别:&、@ 和 =
,当隔离作用域时。
我希望从JavaScript原型继承的角度解释概念,希望有所帮助。
指令的作用域有三种选项:
scope: false
:Angular默认值。指令的作用域恰好是其父作用域(parentScope
)。scope: true
:Angular为此指令创建一个作用域。该作用域是从parentScope
原型继承的。scope: {...}
:下面将解释隔离作用域。
指定scope: {...}
定义了一个isolatedScope
。一个isolatedScope
不会从parentScope
继承属性,尽管isolatedScope.$parent === parentScope
。它通过以下方式定义:
app.directive("myDirective", function() { return { scope: { ... // defining scope means that 'no inheritance from parent'. }, } })
isolatedScope
无法直接访问parentScope
。但有时指令需要与parentScope
进行通信。它们通过@
、=
和&
进行通信。使用符号@
、=
和&
的主题讨论的是使用isolatedScope
的场景。
它通常用于不同页面共享的一些常见组件,例如模态框。隔离作用域可以防止污染全局作用域,易于在页面之间共享。
这是一个基本的指令:http://jsfiddle.net/7t984sf9/5/。下面是一张插图:
@
: 单向绑定
@
简单地把属性从 parentScope
传递到 isolatedScope
。它被称为 单向绑定
,这意味着你不能修改 parentScope
的属性值。如果你熟悉 JavaScript 的继承,你可以很容易理解下面的两种情况:
-
如果绑定的属性是原始类型,比如例子中的
interpolatedProp
:你可以修改interpolatedProp
,但是parentProp1
并不会改变。然而,如果你改变了parentProp1
的值,在 Angular 的 $digest 时,interpolatedProp
会被覆盖为新的值。 -
如果绑定的属性是对象,比如例子中的
parentObj
:因为传递到isolatedScope
的引用值,修改该值将触发以下错误:TypeError: Cannot assign to read only property 'x' of {"x":1,"y":2}
=
: 双向绑定
=
被称为 双向绑定
,这意味着在 childScope
中进行的任何修改都会更新到 parentScope
中的值,反之亦然。这个规则适用于原始类型和对象。如果你把 parentObj
的绑定类型改为 =
,你会发现你可以修改 parentObj.x
的值。一个典型的例子是 ngModel
。
&
: 函数绑定
&
允许指令调用一些 parentScope
函数,并从指令中传入一些值。例如,查看 JSFiddle: & in directive scope。
在指令中定义一个可点击的模板:
使用指令如下:
变量valueFromDirective
通过{valueFromDirective: ...
从指令传递给父控制器。
参考文献:理解作用域
@
会允许一个定义在指令属性上的值传递到指令的隔离作用域中。这个值可能是一个简单的字符串值(myattr="hello"
),也可能是一个带有嵌入式表达式的 AngularJS 插值字符串(myattr="my_{{helloText}}"
)。将其视为从父作用域向子指令的 "单向" 通信。 John Lindquist 有一系列简短的短片解释每个部分。关于 @ 的短片在这里:https://egghead.io/lessons/angularjs-isolate-scope-attribute-binding
&
允许指令的隔离作用域将值传递到父作用域中,以便在属性定义的表达式中进行求值。请注意,指令属性是隐含的表达式,不使用双花括号表达式语法。这一个更难以用文字解释。有关 & 的短片在这里:https://egghead.io/lessons/angularjs-isolate-scope-expression-binding
=
建立起指令的隔离作用域和父作用域之间的双向绑定表达式。对子作用域的更改会传播到父作用域,反之亦然。将 = 视为 @ 和 & 的组合。关于 = 的短片在这里:https://egghead.io/lessons/angularjs-isolate-scope-two-way-binding
最后,这里是一个短片,展示了这三种方式在单个视图中一起使用:https://egghead.io/lessons/angularjs-isolate-scope-review