【发布时间】:2015-08-18 16:02:26
【问题描述】:
我正在尝试使用 angular.injector 作为服务定位器来检索派生许多控制器的基类中的服务。我这样做是因为我不想为了获取我的服务实例而修改数十个控制器的构造函数签名。我非常乐意牺牲这样的流氓服务,以避免在我的控制器上进行大量危险的工作。
我的基本控制器如下所示:
module Controllers {
"use strict";
export class MyBaseController {
static $inject = ["$q"];
protected qService: angular.IQService;
private myService: Services.MyService;
constructor($q: angular.IQService) {
this.qService = $q;
// falls over on this next line
this.myService = angular.injector(["myApp"]).get("MyService");
}
protected myBehaviour(details: any) {
this.myService.myServiceMethod(details);
}
}
}
我的服务如下所示:
module Services {
"use strict";
export class MyService {
static $inject = ["$modal"];
private modal;
private modalInstance;
constructor($modal) {
this.modal = $modal;
}
public myServiceMethod() {
// do something with $modal
}
}
}
我的控制器中的线路错误如下所示:
Error: [$injector:unpr] Unknown provider: $rootElementProvider <- $rootElement <- $animate <- $compile <- $modalStack <- $modal <- ApplicationErrorService
我误解了喷油器的功能吗?是不是因为服务本身有无法解决的依赖,所以无法创建服务的实例?
非常感谢对此提供的任何帮助。
【问题讨论】:
-
当我读到它时,看起来您可能缺少对 ngAnimate 的依赖。
-
为什么不直接将
MyService注入控制器,不确定我是否理解为什么需要通过创建注入器来获取它?你也可以只做constructor(protected qService: angular.IQService) { -
我无法注入 MyService,因为这意味着修改所有派生控制器以传递对服务的引用。
-
@serlingpa 这就是“D”在 SOLID 原则中的含义。而且您尝试做的事情看起来像是一种反模式。
-
是的,我知道。我正在使用依赖注入容器作为服务定位器。但正如我在帖子中解释的那样,我很乐意牺牲这样的流氓服务,以避免在我的控制器上进行大量危险的工作。还有其他的cmets吗?
标签: javascript angularjs typescript