我是AngularJS的新手。谁能解释一下这些AngularJS运算符之间的区别:&, @ and =
用适当的示例隔离范围时。
我是AngularJS的新手。谁能解释一下这些AngularJS运算符之间的区别:&, @ and =
用适当的示例隔离范围时。
Answers:
@
允许将在指令属性上定义的值传递到指令的隔离范围。该值可以是一个简单的字符串值(myattr="hello"
),也可以是带有嵌入式表达式(myattr="my_{{helloText}}"
)的AngularJS插值字符串。可以将其视为从父作用域到子指令的“单向”通信。约翰·林德奎斯特(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
我想从JavaScript原型继承的角度解释这些概念。希望能帮助理解。
可以使用三个选项来定义指令的范围:
scope: false
:默认为角度。该指令的作用域恰好是其父作用域(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
。
它通常用于不同页面共享的一些常见组件,例如Modals。隔离范围可防止污染全局范围,并且易于在页面之间共享。
这是一个基本指令:http : //jsfiddle.net/7t984sf9/5/。要说明的图像是:
@
:单向绑定@
只需将属性从传递parentScope
给isolatedScope
。称为one-way binding
,这意味着您无法修改parentScope
属性的值。如果您熟悉JavaScript继承,则可以轻松理解以下两种情况:
如果binding属性是原始类型,例如interpolatedProp
在示例中:您可以修改interpolatedProp
,但parentProp1
不会更改。但是,如果更改的值parentProp1
,interpolatedProp
将被新值覆盖(当角度$ digest时)。
如果绑定属性是某个对象,例如parentObj
:,因为传递给的对象isolatedScope
是一个引用,则修改值将触发此错误:
TypeError: Cannot assign to read only property 'x' of {"x":1,"y":2}
=
:双向装订=
称为two-way binding
,这意味着对的任何修改childScope
也会更新的值parentScope
,反之亦然。此规则适用于图元和对象。如果将绑定类型更改parentObj
为=
,您将发现可以修改的值parentObj.x
。一个典型的例子是ngModel
。
&
:函数绑定&
允许指令调用某些parentScope
函数并从指令中传递一些值。例如,在指令scope中检查JSFiddle:&。
在指令中定义可点击的模板,例如:
<div ng-click="vm.onCheck({valueFromDirective: vm.value + ' is from the directive'})">
并使用如下指令:
<div my-checkbox value="vm.myValue" on-check="vm.myFunction(valueFromDirective)"></div>
变量valueFromDirective
从指令通过传递给父控制器{valueFromDirective: ...
。
参考:了解范围
不是我的小提琴,而是http://jsfiddle.net/maxisam/QrCXh/显示了区别。关键是:
scope:{
/* NOTE: Normally I would set my attributes and bindings
to be the same name but I wanted to delineate between
parent and isolated scope. */
isolatedAttributeFoo:'@attributeFoo',
isolatedBindingFoo:'=bindingFoo',
isolatedExpressionFoo:'&'
}
AngularJS –孤立的作用域– @ vs = vs&
以下链接提供了带有说明的简短示例:
http://www.codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs
@ –一种方法绑定
在指令中:
scope : { nameValue : "@name" }
鉴于:
<my-widget name="{{nameFromParentScope}}"></my-widget>
= –双向绑定
在指令中:
scope : { nameValue : "=name" },
link : function(scope) {
scope.name = "Changing the value here will get reflected in parent scope value";
}
鉴于:
<my-widget name="{{nameFromParentScope}}"></my-widget>
&–函数调用
在指令中:
scope : { nameChange : "&" }
link : function(scope) {
scope.nameChange({newName:"NameFromIsolaltedScope"});
}
鉴于:
<my-widget nameChange="onNameChange(newName)"></my-widget>
我花了很长时间才能真正解决这个问题。对我来说,关键是要了解“ @”是要在原位求值并作为常量传递给指令的东西,其中“ =”实际上是传递对象本身。
有一个很好的博客文章,对此进行了解释:http : //blog.ramses.io/technical/AngularJS-the-difference-between-@-&-and-=-when-declaring-directives-using-isolate-scopes