大家好,我是IT修真院萌新分院第3期的學員張曉琳,一枚正直、純潔、善良的前端程序員今天給大家分享一下,修真院官網js任務2深度思考中的知識點——什么是控制器?
1.背景介紹
在學習angular的過程中,不同于javascript,遇到了許多新的概念,
比如指令(directive)、服務(service)、控制器(controller)、模型(model)等。
還接觸到了MVC這種將數(shù)據(jù)管理、業(yè)務邏輯控制和數(shù)據(jù)展示分離開,
AngularJS的控制器主要為了把模型和視圖連接在一起。大多數(shù)業(yè)務邏輯操作都會放在視圖對應的控制器中。 當然如果我們能夠把業(yè)務邏輯放到后端的REST服務中,就可以開發(fā)輕量級AngularJS應用。 涉及到多個控制器中使用的業(yè)務邏輯,需要放到一個公共的服務中,然后把改服務注入使用到該業(yè)務邏輯的控制器中。 進而使程序的邏輯性和可維護性更強的思想。接下來,分享、討論一下控制器的用法。
2.知識剖析
1. 理解MVC控制器?
在AngularJS的控制器中,構造函數(shù)會有$scope參數(shù)。
當一個控制器通過ng-controller指令連接到DOM上,
Angular將實例化一個新的控制器對象,然后調用指定的控制器的構造函數(shù)。
一個新的子作用范圍(scope)將被創(chuàng)建,并作為一種可注入的參數(shù)傳遞給控制器的構造函數(shù)為$scope。
如果控制器使用controller as語法附加到DOM上,
那么控制器實例將被分配給新的$scope范圍。
并且多了一個和as同名的屬性,然后把自己指向這個屬性,就方便我們訪問了。
控制器的作用
在控制器中初始化模型(添加屬性)
創(chuàng)建控制器并將它附加到DOM元素之后,AngularJS會創(chuàng)建一個子作用域。
子作用域保存著對應控制器的數(shù)據(jù)模型。子作用域可以通過$scope來獲取。
1. 控制器作用域
因為控制器是附加到DOM元素上,所以存在著一個視圖,有多個控制器。
控制器之間可以是并列的,也可以是嵌套的形式存在。
2. 視圖中控制器并列
各個控制器從附加DOM元素節(jié)點開始,
到節(jié)點對應閉合標簽結束的地方創(chuàng)建了一個子控制域,
單個控制器里面的$scope對象只能訪問和調用該控制器范圍內的屬性和方法。
3. 視圖中控制器嵌套
默認情況下,AngularJS在當前作用域中無法找到某個屬性,就會在父級作用域中進行查找。
即子級控制器會繼承父級控制器中的對象。但是子級作用域和父級作用域中有相同的屬性,
子級使用自己的作用域。這個時候子級作用域要訪問父級作用域的屬性可以通過$parent。
類似JavaScript本身的原型鏈方式。 4. 何為ControllerAs
AngularJS提供$scope方式來處理Controller
3.常見問題
如何在多個controller中進行信息的溝通?
4.解決方案
方法一:利用作用域繼承的原理,子控制器訪問父級控制器中的內容。
方法二:使用service服務進行數(shù)據(jù)傳輸。
在之前的例子我們提到,controller是相對獨立的,兩個controller之間,
內存是不共享的,同級DOM下,兩個controller是無法互相訪問其中的屬性或者方法的。
那么,在實際項目中,我們會有很多的頁面和控制器,
不同頁面下的controller之間有時候是需要傳輸數(shù)據(jù)的,
之前我們學習了localStorage,用于頁面之間的傳參。
其實,官方建議頁面之間通過service互相訪問。
5.編碼實戰(zhàn)
6.擴展思考
問題: 在多個controller中進行信息的溝通還有哪些?
ngularJs項目實戰(zhàn): 不同controller作用域之間通信的方式
7.參考文獻
angular controller as syntax vs scope
8.更多討論
討論:大家對angularJs中的控制器還有哪些理解?
問題:
Q1:王棟:ui-router的子頁面的controller是使用父級的還是自己的
A1:張曉琳:自己的。
Q2:王棟:service怎么傳參?
A2:張曉琳:在請求里面的url里傳參。
Q3:王姣妍:controller與service有什么關系?
Q3:張曉琳:controller和service??是兩個不同的東西????沒啥關系
Q4:王姣妍:controller不能調用service的東西嗎?
Q4:張曉琳:可以調用,但是得注入這個東西