控制器通常用於增強AngularJS範圍。
。當控制器通過ng-controller時。
當指令連接到DOM時,Angular將使用指定的Controller函數初始化壹個新的控制器對象。壹個新的子作用域將被創建為$scope。
變量被註入到控制器的構造函數中。
將控制器連接到視圖有兩種選擇,壹種是將控制器作為語法使用,另壹種是使用$scope。
。如果使用控制器語法,控制器實例將被分配壹個新範圍的屬性。
要知道類型定義,看看這個神奇的倉庫。
,它收集了幾乎所有流行的JavaScript庫。這些類型定義允許我們獲得任何編譯時錯誤和IDE。
智能支持基於。我用的是Visual Studio和Visual Code,兩者對TypeScript都有很好的支持。
如上所述,AngularJS將在需要時創建壹個控制器實例。因此,控制器可以使用
定義了TypeScript中的類。我們知道,壹個類可以被實例化。讓我們在視圖中使用控制器
將儀表板控制器定義為壹種語法方法。以下代碼不使用$scope。
服務。
接口IDashboardVm {
新聞:{標題:字符串,描述:字符串};
message count:number;
人物:數組& lt任何& gt;
標題:字符串;
getMessageCount:()= & gt;ng。IPromise & lt編號& gt;
get people:()= & gt;ng。IPromise & lt數組& lt任何& gt& gt;
}
DashboardController類實現IDashboardVm {
static $ inject:Array & lt;字符串& gt=[' data service '];
構造函數(私有數據服務:app.core.IDataService) {
this . getmessagecount();
this . get people();
}
新聞= {
標題:“新聞”,
描述:“內部服務器團隊對AngularJS、TypeScript & amp' JavaScript '
};
message count:number = 0;
人物:數組& lt任何& gt= [];
hubs summary:Array & lt;任何& gt= [];
title:string = ' Dashboard ';
getMessageCount() {
返回this . data service . getmessagecount()。然後((數據)= & gt{
this.messageCount = data
返回this.messageCount
});
}
getPeople() {
返回this.dataservice.getPeople()。然後((數據)= & gt{
this.people = data
返回this.people
});
}
}
angular . module(“app . dashboard”)。控制器(“DashboardController”,dashboard controller);
利用TypeScript的強類型特征,最好創建壹個包含與視圖相關的所有成員和行為的接口。這使得為控制器定義壹個實現變得容易,並且如果需要的話,這個接口可以被做成壹個抽象方法在其他地方使用。所以,在上面的代碼中,我創建了壹個名為IDashboardVm的文件。
的接口。
接下來,它被稱為DashboardController。
的控制器實現此接口,並為每個成員定義默認狀態。看看這個類的靜態變量$inject
,它告訴AngularJS DI。
初始化這個控制器之前註入了哪些依賴?然後,當參數被註入到這些參數中時,構造函數以與所需依賴項相同的順序定義這些參數。
該類中提到的依賴關系非常簡單,假設是dataservice。
是壹個定制的AngularJS服務,它封裝了對服務器的所有HTTP請求。根據接口中的每個定義,接下來我們需要定義這些行為的實現,並在內部調用dataservice。
方法。它使用承諾。
返回要分配給控制器成員的響應,以便以後控制狀態。
真正重要的是用Angular的模塊API註冊這個控制器。
的位置。在上面的代碼中,首先定義類,然後完成它的註冊。如果這個命令被交換,Angular就找不到我們的控制器了。
已經實現了。在使用JavaScript構造函數時,可以很好地解決問題,因為函數提升起著重要的作用。
。
下面是這個控制器在Angular-UI UI-Router中的工作方式。
中使用的代碼片段,但如果您想使用Angular的內置路由模塊,概念是相同的。請註意,這只顯示了controllerAs的用法。
語法來配置部件。
配置:{
URL:“/”,
templateUrl:'應用程序/儀表板/儀表板. html ',
控制器:'儀表板控制器',
控制器:“虛擬機”,
標題:“儀表板”,
}
如果妳想使用$ TERM的$ TERM範圍
服務,那麽您可以像下面的代碼片段那樣擴展上面的接口。這將確保IScope的所有成員都能通過該接口訪問它。使用這個方法還需要改變控制器類的實現,因為現在需要$scope。
服務的依賴性。然後,自定義接口類型可以在構造函數中使用$scope。
參數是強類型的,並且受到智能支持。
IDashboardVm接口擴展了angular。IScope {
新聞:{標題:字符串,描述:字符串};
message count:number;
人物:數組& lt任何& gt;
標題:字符串;
getMessageCount:()= & gt;ng。IPromise & lt編號& gt;
get people:()= & gt;ng。IPromise & lt數組& lt任何& gt& gt;
}