1

根據Todd Motto's styleguide, Controllers chapter角:依賴注入與原型繼承

繼承:擴展的控制器類時使用原型繼承

我嘗試實施它在我的控制器:

function BaseController(){ 
    'use strict'; 

    this._path = ''; 
    this._restService = undefined; 
} 

/** 
* Boring JSDocs 
*/ 
BaseController.prototype.getById = function(id) { 
    return this._restService.getById(this._path, id); 
}; 

TagModalController.prototype = Object.create(BaseController.prototype); 

/** 
* Even more boring JSDocs 
*/ 
function TagModalController(CommunicationService, $modalInstance, mode, 
    id, CommandService) { 
    'use strict'; 

    // boring assertions 

    this.setPath('tags'); 
    this.setRestService(CommunicationService); 

但是,正如你所看到的,我必須始終設置在BaseController中需要用於與服務器端通信的3210。是否有可能將其注入CommunicationService注入TagModalController?然後我的代碼看起來就像這樣:

function BaseController(CommunicationService){ 
    'use strict'; 

    this._path = ''; 
    this._restService = CommunicationService; 
} 

和方法this.setRestService(CommunicationService);將不再需要。有沒有什麼方法可以在AngularJS中爲控制器實現Angular DI的原型繼承?預先感謝您的每一個答案。

回答

1

這可以被認爲是一個必要的罪惡。即使使用ES2015類,父類構造函數have to be specified explicitly with super的參數也是如此。

您可能要借用類使用繼承的模式,做

angular.bind(this, BaseController)(CommunicationService, ...); 

將變量傳遞給BaseController構造,特別是如果有應該有過一個以上的相關性。

BaseController未被$controller實例化,因此不會受益於角度DI,this是將BaseController與子級聯繫起來的唯一東西。爲了使它能夠訪問TagModalController注入的依賴項,必須將它們分配爲this屬性,並因此暴露給範圍(角度控制器沒有考慮到this的設計,並且controllerAs只是用於彌補$scope缺點的語法糖)。這不是一件好事。