在Angular中,有幾種不同的方式來聲明和使用控制器。
在最開始的時(shí)候我們對于angular在view上的綁定都必須使用直接的scope對象,對于controller來說我們也得必須注入$scope這個(gè)service。
angular從1.2版本開始帶來了新語法Controller as。
它使我們不需要把$scope作為依賴項(xiàng)。簡潔了controller,同時(shí)我們可以使用this在控制器上直接添加我們想要的任何屬性。
$scope和this是什么?
引入controller as之前的寫法
引入controller a's之后的寫法
類比一下js中的構(gòu)造函數(shù)和實(shí)例:
用new方法給myClass()一個(gè)實(shí)例對象,我們可以在這個(gè)實(shí)例中訪問myClass()中的屬性和方法;
app.controller('MainCtrl',function(){})就是在定義一個(gè)名稱為MainCtrl的構(gòu)造函數(shù),MainCtrl as main就是在實(shí)例化,生成MainCtrl的實(shí)例main,然后就可以在main中訪問MainCtrl里定義的變量和函數(shù)
這樣類比的話,scope對象類似于構(gòu)造函數(shù)的原型對象,this則是指當(dāng)前實(shí)例對象
controller as有哪些優(yōu)點(diǎn)
1、controller as讓繼承關(guān)系的變量之間更清晰可讀
使用controller as后,在視圖嵌套中雙向綁定的數(shù)據(jù)所屬清晰可見,不會出現(xiàn)分不清哪個(gè)是哪個(gè)的問題;
2、controller as 方式解決了父子$scope帶來的混亂
直接使用$scope會產(chǎn)生父變字變,子變父不變的現(xiàn)象。當(dāng)一個(gè)對象的原型鏈上有屬性foo,你再給這個(gè)對象賦上一個(gè)屬性foo,它不會改變原型鏈上的屬性foo。只是新建的一個(gè)foo,在原型鏈的更近端,訪問這個(gè)屬性時(shí)不會在去尋找更遠(yuǎn)處的foo屬性。
使用controller as方式可以避免上面的混亂,讓關(guān)系更清晰:
controller as有哪些應(yīng)用方式?
1、在view視圖中定義
2、在路由配置中定義
對象__proto__屬性的值就是它所對應(yīng)的原型對象;
controller as的實(shí)質(zhì)是什么?
controller as的實(shí)質(zhì)是一種語法糖,我們可以看一下angular源碼:
從上面的代碼我們能看見的是:angular只是把controller這個(gè)對象實(shí)例以其as的別名在scope上創(chuàng)建了一個(gè)新的對象屬性。
等價(jià)于
參考文獻(xiàn):
AngularJS Controller As Syntax:
angular controller as syntax vs scope:
MENU AngularJS: "Controller as" or "$scope"? :
angularjs 中 controller as 引入的意義:
vm是什么?
vm是“view model”,controller函數(shù)實(shí)例的統(tǒng)稱。
為什么在controller中不直接用this,而要用vm等代指this?
為了避免this指向的混亂
controller as有缺點(diǎn)嗎?
使用controller as并不能提升整體性能,只是對我們簡潔代碼的一種規(guī)定,因?yàn)闆]有了$scope,而controller實(shí)例將會成為scope上的一個(gè)屬性,所以在controller中不能使用$watch,$emit,$on之類的特殊方法,因?yàn)檫@些東西往往不該出現(xiàn)在controller中的。