Javascript 角度。喷油器的行为与想象的不一样

Javascript 角度。喷油器的行为与想象的不一样,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,我正在尝试使用angular.injector作为服务定位器来检索基类中的服务,许多控制器都是从基类派生的。我这样做是因为我不想为了获得我的服务实例而修改几十个控制器的构造函数签名。为了避免在我的控制器上进行大量危险的工作,我非常乐意牺牲像这样的流氓服务 我的基本控制器如下所示: module Controllers { "use strict"; export class MyBaseController { static $inject = ["$q"];

我正在尝试使用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
我的服务如下所示:

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
控制器中线路上的错误如下所示:

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
错误:[$injector:unpr]未知提供程序:$rootElementProvider
问题是我无法创建服务实例,因为服务本身具有无法解决的依赖关系


对。具体而言,
$rootElement
不可用。这是一个信号,表明代码在angular启动之前正在执行:

据我所知,您可能缺少对ngAnimate的依赖。为什么不将
MyService
注入控制器,但我不确定是否理解您为什么需要通过创建注入器来获取它?您也可以只做
构造函数(protected qService:angular.IQService){
我不能注入MyService,因为这意味着修改所有派生控制器以传入对服务的引用。@serlingpa这就是“D”代表坚实的原则。你试图做的看起来像是反模式。是的,我知道。我使用依赖注入容器作为服务定位器。但正如我在帖子中解释的那样,我很高兴牺牲像这样的流氓服务,以避免在我的控制器上进行大量危险的工作。还有其他评论吗?但是直到我在上面注释的那一行被击中,错误才会发生。