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 が提供する便利な機能です。内部では、$injector は Angular によってオブジェクト インスタンスを取得するために使用されます。しかし、$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

以下は、私が最近遭遇した使用例の 1 つです。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 に答える