您好我正在學習的角度也失去了我的腦海理解之間'變種' 的區別,'這個'和'$範圍'。
雖然我讀了這個link但它超出了我的頭。
當我使用ng-controller="myController as ctrl"
時,我只能訪問這個上設置的變量和函數。
雖然定義ng-controller="myController"
我只能訪問$ scope上設置的變量和函數。
有人可以深入解釋這個話題嗎?
回答
關鍵字var
是純粹的JavaScript,只是你如何在javascript中聲明變量。像這樣:
var myName = 'Nikolaj';
var myAge = 1700;
// etc.
如果你不熟悉var
你應該冒險進入前角學習JavaScript,因爲角度的學習曲線,可以說是相當陡峭的開始。
這樣說我會試着解釋其他的概念。
使用controllerAs
當使用推薦controllerAs語法,你在你的模板控制器實例的引用。這是使用<div ng-controller="myController as ctrl"></div>
時會發生的情況;
您的控制器基本上是「新的」,並存儲在一個名爲ctrl
的變量中,該變量通過角度在模板中可用。這允許您訪問控制器成員(公共函數和變量)的模板是這樣的:
<div ng-controller="myController as ctrl">
<p>{{ctrl.name}}</p>
</div>
爲了使變量name
在模板可用,首先必須聲明爲public成員/你的控制器的變量。這正是this
關鍵字發揮作用的地方。當你創建你的控制器,使變量name
公衆,你會做這樣的:
angular.module('app').controller('myController', function(){
this.name = 'My name variable';
});
這裏this
是在Javascript中一個特殊的概念,那就是函數上下文的引用 - 但只是基本的JavaScript。
使用$範圍
當你改用您的控制器是這樣的:<div ng-controller="myController"></div>
你沒有在你的模板直接訪問控制器實例。相反,每次在角度表達式中使用某些東西時,例如{{name}}
,Angular隱含地假定變量name
存在於$ scope變量上。鏈接到模板時,每個控制器都有一個$ scope變量。要訪問您的控制器體內這個變量,你會喜歡這個訪問:
angular.module('app').controller('myController', function($scope){
$scope.name = 'My name variable';
});
之所以controllerAs建議語法,因爲使用$範圍時,在某種程度上,它可以當你有多個嵌套的作用域(即嵌套控制器)時,很難確定你指的是哪個作用域。如本例:
<div ng-controller="FirstController">
<h1>{{firstControllerVariable}}</h1>
<div ng-controller="SecondController">
<h2>{{whereDoIBelong}}</h2>
</div>
</div>
隨着controllerAs語法,這是很清楚哪些變量屬於哪個控制器:
<div ng-controller="FirstController as first">
<h1>{{first.firstControllerVariable}}</h1>
<div ng-controller="SecondController as second">
<h2>{{second.iKnowWhereIBelong}}</h2>
</div>
</div>
另一個原因是使用controllerAs語法是因爲它會更容易遷移到ES2016及以上。
因此,如果我沒有錯,使用** controllerAs **語法允許我們引入一個綁定到我們控制器的新命名空間,而不需要將範圍屬性放入額外的對象字面值中? – CoderX
它並不像綁定到控制器那樣多的新命名空間,因爲它是對控制器實例本身的引用。你可以想象它的工作原理是這樣的:'var ctrl = new myController()'在幕後。 –
- 1. AngularJS分離範圍:VS =
- 2. $範圍變量VS ngTable文檔中VAR
- 3. isset($ var)vs @ $ var
- 4. Perl%{$ var} vs%$ var
- 5. Angularjs $範圍和此功能
- 6. [[-n $ VAR] VS [[-n $ {VAR: - }]
- 7. Mule ASYNC範圍vs VM
- 8. 角指令:範圍VS bindToController
- 9. JavaScript本地範圍:var與此對比
- 10. 範圍vs ctags在功能方面
- 11. AngularJs 1.x中的指令:隔離範圍vs要求ngModel
- 12. VAR VS對象在C#
- 13. var vs * var的gdb/x命令var
- 14. $ injector.instantiate VS $ injector.get VS $ injector.invoke in angularjs
- 15. 在AngularJs範圍
- 16. AngularJS $ http vs $ http.post
- 17. NPM包本地VS全球範圍
- 18. $狀態VS在AngularJS
- 19. Symfony 1.4 vs Symfony 2.0混淆
- 20. Java序列化1.4 vs 1.6
- 21. 會話範圍的託管bean vs有狀態的bean vs httpsession
- 22. 範圍angularjs
- 23. 春季的線程範圍vs請求範圍
- 24. 紅寶石 - 詞法範圍VS繼承
- 25. AngularFire VS $ bindTo結合範圍是什麼?
- 26. 檢索X行,TOP VS範圍
- 27. ActiveRecord Rails 3範圍vs類方法
- 28. Java int的VS整數 - 不同範圍
- 29. Arrow語法VS ES5函數範圍
- 30. 使用angularjs $超時與「此」insted $範圍
['this'vs $ scope in AngularJS controllers](https://stackoverflow.com/questions/11605917/this-vs-scope-in-angularjs-controllers) – Vivz