ES6 中的 AngularJS 控制器继承



我在AngularJS中有项目,我有baseController和子控制器继承自它。

class BaseController {
constructor($log, $state) {
'ngInject';
this.$log = $log;
this.$state = $state;
}
}
class ChildController extends BaseController {
constructor(myService) {
'ngInject';
super();
this.myService = myService;
}
}

我的问题是:即使我不使用它,我是否需要将所有父依赖项注入到子控制器中?

上面的例子显示了我想要实现的目标,但它不起作用。有人知道我是否可以在不将 BaseController 服务传递到super($scope, $state)调用的情况下实现它吗?

$injector 服务仅将依赖项注入实例化类的构造函数中。它不会注入祖先类的构造函数。

要使用祖先类中的可注射物构造控制器,请使用 $injector 服务和 angular.extend:

class BaseController {
constructor($log, $window) {
'ngInject';
this.$log = $log;
this.$window = $window;
}
}
class ChildController  ̶e̶x̶t̶e̶n̶d̶s̶ ̶B̶a̶s̶e̶C̶o̶n̶t̶r̶o̶l̶l̶e̶r̶ {
constructor(myService, $injector) {
'ngInject';
var base = $injector.instantiate(BaseController);
angular.extend(this, base);
̶s̶u̶p̶e̶r̶(̶)̶;̶
this.myService = myService;
}
$onInit() {
this.$log.info("$onInit");
this.$log.log(this.base);
}
}

演示

class BaseController {
constructor($log, $window) {
'ngInject';
this.$log = $log;
this.$window = $window;
this.base = "Hello from BaseController";
}
}
class ChildController {
constructor(myService, $injector) {
'ngInject';
var base = $injector.instantiate(BaseController);
angular.extend(this, base);
//super();
this.myService = myService;
}
$onInit() {
this.$log.info("$onInit");
this.$log.log(this.base);
}
}
angular.module("app",[])
.controller("child", ChildController)
.value("myService", {})
<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app="app" ng-controller="child as vm">
{{vm.base}}
</body>

最新更新