我已經在不同的地方閱讀過,重要的是你總是在你的示波器中使用物體,但是我還沒有找到明確的答案。有人可以幫幫我嗎?
回答
我喜歡Ryan Q的回答,但是在做了一些更多的研究之後,我想添加一個更重視javascript原型繼承的答案。
這裏的問題是一個對象與原始問題(通過引用傳遞並通過值傳遞)以及Javascript的原型繼承如何工作。
當JavaScript類繼承自父類時,它將值複製到子類中。有兩種可以複製的值,對象或基元。
當通過繼承複製對象時,它通過引用傳遞。這意味着我在子對象中所做的更新也會在父對象中看到。
當通過繼承複製一個原語時,它通過值傳遞。這意味着任何更新都不會在父類中看到。
這與角度範圍有什麼關係?當我們創建一個指令時,將爲該指令創建一個範圍,我們可以將其聲明爲一個獨立範圍或一個繼承範圍。如果它是一個繼承範圍,它將繼承其父項範圍項目。現在,如果我的父範圍中有原始值,我將通過值傳遞將它們繼承到我的子範圍中。這意味着當我在我的父作用域中進行更改時,它不會在我的子作用域中看到,反之亦然。現在我可以在具有不同值的子和父範圍中使用相同的繼承變量。這會導致混亂......。並可能憤怒......大聲笑。
所以如果你只是使用一個對象,那麼這個問題就不會發生。這就是爲什麼你總是應該在範圍內反對的原因。
比方說你有3個控制器,主控制,另外兩個從主控制繼承。
您的html可能看起來像這樣。
<div ng-controller="MainCtrl">
<div ng-show="helloWorld">Hello World</div>
<div ng-controller="Sub1Ctrl">
<button type="button" ng-click="helloWorld = false">Hide Hello World</button>
</div>
<div ng-controller="Sub2Ctrl">
<button type="button" ng-click="helloWorld = false">Hide Hello World</button>
</div>
</div>
你的主控制器
angular.module('MyModule').controller('MainCtrl', function($scope){
$scope.helloWorld = true;
});
一切都很好,很正常,你的世界你好元素顯示如預期。現在嘗試單擊將helloWorld設置爲false的那些按鈕之一。你Sub1Ctrl現在這個樣子:
angular.module('MyModule').controller('Sub1Ctrl', function($scope){
$scope.helloWorld = false;
});
但你MainCtrl仍將
angular.module('MyModule').controller('MainCtrl', function($scope){
$scope.helloWorld = true;
});
這是爲什麼?那麼因爲當Angular評估「helloWorld = false」時,它會在內部設置$ scope [「helloWorld」] = false。這個問題是因爲你將它設置在較低的Sub1Ctrl上,從未設置較高的控制器。
如果你改變你的HTML和MainCtrl這樣:
<div ng-controller="MainCtrl">
<div ng-show="myModel.helloWorld">Hello World</div>
<div ng-controller="Sub1Ctrl">
<button type="button" ng-click="myModel.helloWorld = false">Hide Hello World</button>
</div>
<div ng-controller="Sub2Ctrl">
<button type="button" ng-click="myModel.helloWorld = false">Hide Hello World</button>
</div>
</div>
angular.module('MyModule').controller('MainCtrl', function($scope){
$scope.myModel = {
helloWorld: true
}
});
然後角度將查找並將其值設置之前是否在範圍內的原型存在的對象(即控制器通過Scope Hierarchy如何繼承) 。
所以現在Angular評估Sub1Ctrl上的「myModel.helloWorld」,它最終在父MainCtrl上查找「myModel」,並將helloWorld屬性設置爲false。
因爲那麼你將數據保存在一個地方。例如,子範圍(不是獨立範圍)可以隱藏屬性「消息」。所以父範圍和子範圍都有一個「消息」屬性。但是,如果父範圍具有「data.message」屬性,則除非在子範圍中首先創建一個屬性「data」,然後再指定「data.message」,否則子範圍無法影響此屬性,但這不是AngularJS所做的。但是AngularJS確實在父範圍內創建了第一個「數據」,然後是「data.message」。
- 1. 在對象中使用Angular $ scope變量
- 2. 爲什麼在你使用MySQL數據庫時創建對象?
- 3. 你什麼時候說你是完美的面向對象?
- 4. 爲什麼你不能在python中添加屬性到對象?
- 5. 爲什麼你不需要在Java中創建對象?
- 6. 在面向對象編程中你是什麼意思的對象?
- 7. 你在Silverlight中使用IsolatedStorage是爲了什麼?
- 8. 爲什麼Angular讓你在配置塊中注入$ provide服務?
- 9. 你爲什麼使用T4?
- 10. Java:爲什麼你需要構造函數來在父類中使用對象?
- 11. 爲什麼當你使用git合併時,webrat.log總是衝突?
- 12. 你爲什麼要把/ *放在你的jQuery函數中?
- 13. 你爲什麼要在Rails中動態生成你的secret_token.rb?
- 14. 你用什麼工具來建模你的域對象?
- 15. 你正在使用Perl,是什麼讓你進入它?
- 16. 爲什麼你不能在指針對象上調用函數?
- 17. 爲什麼使用你的超類創建一個對象?
- 18. 在OOP中,你在什麼情況下對對象採取行動而不是讓對象行爲?
- 19. 你使用什麼文件格式爲你的應用程序,爲什麼?
- 20. 爲什麼你會在字典中使用不可變的值?
- 21. 爲什麼你可以在'initialize'中調用instance_eval(而不是class_eval)?
- 22. 你在哪裏存儲/創建你的模型在Angular中?
- 23. 如果你從字典繼承,爲什麼__dict__總是空的?
- 24. 在Matlab中保存你的對象
- 25. 爲什麼我不能在Angular的工廠中注入$ scope?
- 26. 你是否總是在Hibernate中使用二級緩存?
- 27. 爲什麼總是在循環中使用對象的最後一個引用?
- 28. 當你使用Spring Roo時,你的.gitignore中有什麼?
- 29. 你會選擇在你的應用程序中使用什麼導航控件?
- 30. 在Java中,你什麼時候使用const而不是final?
這一個:http://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs – Cherniv
切爾諾夫:我認爲你已經鏈接的答案確實爲這個問題提供了指導,並深入探討了更大範圍的問題。但我相信這個頁面上的問題討論了Angular開發人員應該知道的一個重要且更具體的問題。所以我相信它是值得迴應的。 – CBP