【问题标题】:angular.injector not behaving as imaginedangular.injector 的行为不像想象的那样
【发布时间】: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


【解决方案1】:

是我无法创建服务实例的问题,因为服务本身有无法解决的依赖关系

是的。特别是$rootElement 不可用。这是一个明显的迹象,表明代码在 angular 被引导之前正在执行:https://docs.angularjs.org/api/ng/function/angular.bootstrap

【讨论】:

  • 但是直到我上面注释的那行被命中后才会出现错误。
猜你喜欢
  • 2011-02-03
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多