AngularJS动态注入范围或控制器

时间:2013-01-19 15:30:01

标签: javascript angularjs

是否可以在运行期间注入示波器或控制器? 或任何其他建议动态地将服务注入控制器?

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

    // some actions

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

});

提前致谢

2 个答案:

答案 0 :(得分:60)

可以使用$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
}

Fiddle

答案 1 :(得分: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 

现在您可以使用与您在应用程序中使用其他服务类似的方式使用该服务。