gpt4 book ai didi

javascript - Angular : Dependency Injection with prototypal inheritance

转载 作者:行者123 更新时间:2023-11-27 23:47:07 26 4
gpt4 key购买 nike

根据Todd Motto's styleguide, Controllers chapter :

Inheritance: Use prototypal inheritance when extending controller classes

我尝试在我的 Controller 中实现它:

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 注入(inject) TagModalController 一样注入(inject)它?然后我的代码将如下所示:

function BaseController(CommunicationService){
'use strict';

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

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

最佳答案

这可以被认为是一种必要的罪恶。即使对于 ES2015 类,父类构造函数的参数 have to be specified explicitly with super .

您可能想借用类用于继承的模式

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

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

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

关于javascript - Angular : Dependency Injection with prototypal inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33064219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com