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
缺点的语法糖)。这可不是什么好事。
根据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
缺点的语法糖)。这可不是什么好事。