我對AngularJS很新。有沒有人可以用適當的例子來解釋這些差異(&,@和=)。&vs @ and = in angularJS有什麼區別
回答
@
允許在指令屬性中定義的值被傳遞到該指令的分離範圍。該值可以是簡單的字符串值(myattr="hello"
),也可以是帶嵌入表達式的AngularJS插入字符串(myattr="my_{{helloText}}"
)。將其視爲從父範圍到子指令的「單向」通信。 John Lindquist有一系列簡短的視頻短片解釋每一個。 @上的屏幕視頻位於:https://egghead.io/lessons/angularjs-isolate-scope-attribute-binding
&
允許指令的隔離範圍將值傳遞到父級作用域以在屬性中定義的表達式中進行評估。請注意,指令屬性隱含地是一個表達式,並且不使用雙重大括號表達式語法。這一個更難以在文本中解釋。 Screencast on & is here: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;強烈推薦Egghead.io視頻 – 2013-02-16 18:07:33
這些鏈接看起來已經改變,他們現在是: 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,分別。 – Samih 2014-10-17 10:35:13
感謝您的標註,我用正確的URL更新了我的答案。 – 2014-11-19 21:04:01
不是我的小提琴,但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:'&'
}
我想從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繼承,你可以很容易地理解這兩個場景:
如果綁定屬性是基本類型,比如上例中
interpolatedProp
:您可以修改interpolatedProp
,但parentProp1
不會改變。但是,如果更改parentProp1
的值,則interpolatedProp
將被新值覆蓋(當角度$摘要時)。如果綁定屬性是一些對象,像
parentObj
:自所述一個傳遞到isolatedScope
是一個參考,修改值將觸發此錯誤:TypeError: Cannot assign to read only property 'x' of {"x":1,"y":2}
=
:雙雙向綁定
=
被稱爲two-way binding
,這意味着childScope
中的任何修改也會更新va在parentScope
中,反之亦然。此規則適用於基元和對象。如果將parentObj
的綁定類型更改爲=
,則會發現可以修改parentObj.x
的值。一個典型的例子是ngModel
。
&
:功能結合
&
允許指令調用一些parentScope
功能,並通過在從指示一定的價值。例如,檢查JSFiddle: & in directive scope。
定義一個可點擊的模板的指令,如:
<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: ...
通過。
默認情況下,指令使用共享作用域。如果指令具有'範圍:真',那麼它使用繼承範圍,其中子可以看到父屬性,但父母不能看到子內部屬性。 – YuMei 2015-07-24 18:27:11
** AngularJS - 隔離作用域 - @ VS = VS&** ---------- 與解釋短的例子可在下面的鏈接: http://www.codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs – 2017-06-27 17:25:21
我花了很長一段時間地獄真正得到這個句柄。對我來說,關鍵是要理解「@」是用於你想要在現場進行評估並作爲常量傳遞給指令的東西,其中「=」確實傳遞了對象本身。
有,說明這一點這在一個不錯的博客文章:http://blog.ramses.io/technical/[email protected]&-and-=-when-declaring-directives-using-isolate-scopes
刪除最終的斜槓('/')使網址正常工作。 – 2016-06-02 22:31:21
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>
- 1. Seq.iter vs - 有什麼區別?
- 2. |有什麼區別? vs. ||
- 3. http_basic_authenticate_with AND authenticate_or_request_with_http_basic有什麼區別?
- 4. 'and,or'和'&&,||'有什麼區別?
- 5. sjlj vs dwarf vs seh有什麼區別?
- 6. Knockout.js observableArray vs Backbone.js Collection - 有什麼區別?
- 7. .replace和-replace in powershell有什麼區別?
- 8. 有什麼區別:to和=> in rails
- 9. Oracle:=和in有什麼區別?
- 10. linux kernel:module或built-in有什麼區別?
- 11. INTERSECT和WHERE IN有什麼區別?
- 12. AddHandler vs. Handles - 有什麼區別?
- 13. npm 3 vs Bower有什麼區別?
- 14. Rails wrap_parameters vs include_root_in_json,有什麼區別?
- 15. com.cloudera.sqoop.SqoopOptions vs org.apache.sqoop.SqoopOptions有什麼區別嗎?
- 16. 有什麼區別?
- 17. 有什麼區別
- 18. datetime上的「BETWEEN AND」和「> AND <=」有什麼區別?
- 19. JAVA:邏輯AND/OR和短路AND/OR有什麼區別?
- 20. python:var vs. self.var(有什麼區別?)
- 21. javax.ws.rs.core.Cookie vs javax.ws.rs.core.NewCookie,有什麼區別?
- 22. log4j RollingFileAppender vs DailyRollingFileAppender有什麼區別
- 23. 'while(true)`vs`while(\ true)`有什麼區別?
- 24. .tar vs .tgz ...有什麼區別?
- 25. 果醬vs鮑爾,有什麼區別?
- 26. img.height vs img.style.height有什麼區別?
- 27. Application.FileDialog vs GetOpenFilename:有什麼區別?
- 28. IntegratedWindowsAuthentication vs Negotiate有什麼區別?
- 29. CreateThread vs PsCreateSystemThread - 有什麼區別?
- 30. getHeight()vs getPreferredHeight()有什麼區別
參見http://stackoverflow.com/questions/14050195/what-是指示範圍內的差異 – 2013-02-16 18:10:39