15

是否可以在运行期间注入作用域或控制器?或任何其他将服务动态注入控制器的建议?

Application.controller('IndexController', function($scope){

    // some actions

    if(someconditions) {
            $scope.$inject = [someServiceName];
            // and here i want to use service methods 
    }

});

提前致谢

4

2 回答 2

62

可以使用$injector将服务动态注入(按名称)到控制器中。能够通过控制器参数注入服务只是 Angular 提供的一种便利。在底层,Angular 使用 $injector 来检索对象实例。但是我们也可以自己使用 $injector。

function MyCtrl($scope, $injector) {
  $scope.doSomething = function(someService) {
    var service = $injector.get(someService)  // someService contains the name of a service
    service.value += 10
}

小提琴

于 2013-01-19T20:11:32.037 回答
4

以下是我最近遇到的一个用例,我试图在 Factoy 中注入服务“myService”并得到以下错误。

**Uncaught Error:** *[$injector:cdep] Circular dependency found: $http <- $modal <- myService <- interceptorFactory <- $http <- $templateRequest <- $compile*

[http://errors.angularjs.org/1.3.0/$injector/cdep?p0=%24http%20%3C-%20%24mod%E2%80%A6orFactory%20%3C-%20%24http%20%3C-%20%24templateRequest%20%3C-%20%24compile][1]

为了解决这个问题,$injector 成为了救命稻草

var service = $injector.get('myService') //this will create a dynamic service instance 

现在您可以像在应用程序中使用其他服务一样使用该服务。

于 2015-04-23T09:56:03.283 回答