Angular:具有原型继承的依赖注入

Angular: Dependency Injection with prototypal inheritance

根据Todd Motto's styleguide, Controllers chapter

Inheritance: Use prototypal inheritance when extending controller classes

我尝试在我的控制器中实现它:

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);

但是,如您所见,我必须始终设置 restService,这是 BaseController 与服务器端通信所需要的。是否有可能像 CommunicationService 注入 TagModalController 一样注入它?那么我的代码将如下所示:

function BaseController(CommunicationService){
    'use strict';

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

并且方法 this.setRestService(CommunicationService); 将不再需要。有什么方法可以在 AngularJS 中通过控制器的原型继承来实现 Angular DI?预先感谢您的每一个回答。

这也算是一个不得已的恶。即使使用 ES2015 classes 父 class 构造函数 have to be specified explicitly with super.

的参数

您可能想借用 classes 用于继承的模式并做

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

将变量传递给 BaseController 构造函数,尤其是当有多个依赖项需要传递到那里时。

BaseController 未由 $controller 实例化,因此无法从 Angular DI 中受益,this 是唯一将 BaseController 与子级关联的东西。为了让它能够访问 TagModalController 注入的依赖项,它们必须被分配为 this 属性并因此暴露给范围(Angular 控制器在设计时并未考虑 this,并且controllerAs 只是弥补 $scope 缺点的语法糖)。这可不是什么好事。