angularJS中&与@和=之间有什么区别


Answers:


375

@允许将在指令属性上定义的值传递到指令的隔离范围。该值可以是一个简单的字符串值(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



1
感谢您的标注,我用正确的网址更新了答案。
悬崖.meyers 2014年

43
当可能有大量包含相同信息的免费内容出现时,评分最高的答案链接到付费墙后面的视频有点可惜。
BenCr


7
付费内容减去一。
Arel Sapir

109

我想从JavaScript原型继承的角度解释这些概念。希望能帮助理解。

可以使用三个选项来定义指令的范围:

  1. scope: false:默认为角度。该指令的作用域恰好是其父作用域(parentScope)之一。
  2. scope: true:Angular为此指令创建作用域。范围原型从继承parentScope
  3. 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/。要说明的图像是:

在此处输入图片说明

@:单向绑定

@只需将属性从传递parentScopeisolatedScope。称为one-way binding,这意味着您无法修改parentScope属性的值。如果您熟悉JavaScript继承,则可以轻松理解以下两种情况:

  • 如果binding属性是原始类型,例如interpolatedProp在示例中:您可以修改interpolatedProp,但parentProp1不会更改。但是,如果更改的值parentProp1interpolatedProp将被新值覆盖(当角度$ 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: ...

参考:了解范围


默认情况下,指令使用共享范围。如果指令具有“ scope:true”,则它使用继承的作用域,在该作用域中,子级可以看到父级属性,但父级不能看到子级内部属性。
YuMei

1
AngularJS –孤立的作用域– @ vs = vs& ----------以下示例提供了简短的解释说明: codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs
Prashanth

24

不是我的小提琴,而是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:'&'
        }        

17

@:单向绑定

=:双向绑定

:函数绑定


5
@的一个重要警告不仅是单向的,而且是沿途的字符串
Shawson

@Shawson:那么如何绑定单向非字符串(例如int或bool)?
或Mapper

如果您愿意,可以使用@的值并将其转换为int / bool?否则,我只会使用=或<
Shawson

7

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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.