402

私は次のようなサービスを提供しています:

angular.module('app').factory('ExampleService', function(){
  this.f1 = function(world){
    return 'Hello '+world;
  }
  return this;
})

JavaScriptコンソールからテストして、サービスの関数を呼び出したいと思いf1()ます。

どうやってやるの?

4

4 に答える 4

729

TLDR:1行で、探しているコマンドは次のとおりです。

angular.element(document.body).injector().get('serviceName')

ディープダイブ

AngularJSは、依存性注入(DI)を使用して、サービス/ファクトリをコンポーネント、ディレクティブ、およびその他のサービスに注入します。したがって、サービスを取得するために必要なことは、最初にAngularJSのインジェクターを取得することです(インジェクターは、すべての依存関係を接続し、それらをコンポーネントに提供する責任があります)。

アプリのインジェクターを取得するには、Angularが処理している要素からインジェクターを取得する必要があります。たとえば、アプリが呼び出したbody要素に登録されている場合injector = angular.element(document.body).injector()

取得したものから、injector好きなサービスを利用できますinjector.get('ServiceName')

この回答の詳細:Angularからインジェクターを取得できません
さらにここに:レガシーコードからAngularJSを呼び出します


$scope特定の要素を取得するためのもう1つの便利なトリック。開発者ツールのDOM検査ツールで要素を選択してから、次の行を実行します($0常に選択された要素です)。
angular.element($0).scope()

于 2013-03-20T23:10:29.603 に答える
25

まず第一に、あなたのサービスの修正版。

a)

var app = angular.module('app',[]);

app.factory('ExampleService',function(){
    return {
        f1 : function(world){
            return 'Hello' + world;
        }
    };
});

これはオブジェクトを返しますが、ここでは何も新しいものではありません。

これをコンソールから取得する方法は次のとおりです。

b)

var $inj = angular.injector(['app']);
var serv = $inj.get('ExampleService');
serv.f1("World");

c)

以前にそこで行っていたことの1つは、app.factoryが関数自体またはその新しいバージョンを返すと想定することでした。そうではありません。コンストラクターを取得するには、次のいずれかを実行する必要があります。

app.factory('ExampleService',function(){
        return function(){
            this.f1 = function(world){
                return 'Hello' + world;
            }
        };
    });

これにより、ExampleServiceコンストラクターが返されます。このコンストラクターは、次に「新規」を実行する必要があります。

または、代わりに

app.service('ExampleService',function(){
            this.f1 = function(world){
                return 'Hello' + world;
            };
    });

これにより、インジェクション時に新しいExampleService()が返されます。

于 2013-03-20T16:24:57.193 に答える
14

@JustGoschaの答えは的確ですが、アクセスしたいときに入力することがたくさんあるので、これをapp.jsの下部に追加しました。次に、入力x = getSrv('$http')する必要があるのはhttpサービスを取得することだけです。

// @if DEBUG
function getSrv(name, element) {
    element = element || '*[ng-app]';
    return angular.element(element).injector().get(name);
}
// @endif

グローバルスコープに追加されますが、デバッグモードでのみ追加されます。@if DEBUGプロダクションコードで終わらないように、 中に入れました。このメソッドを使用して、prouductionビルドからデバッグコードを削除します。

于 2013-12-09T15:34:49.507 に答える
4

Angularjs依存性注入フレームワークは、アプリモジュールの依存性をコントローラーに注入する役割を果たします。これは、インジェクターを介して可能です。

最初にng-appを識別し、関連するインジェクターを取得する必要があります。以下のクエリは、DOMでng-appを検索し、インジェクターを取得するために機能します。

angular.element('*[ng-app]').injector()

ただし、Chromeでは、以下に示すように、ターゲットng-appをポイントできます。$0ハックと問題を使用しますangular.element($0).injector()

インジェクターを入手したら、以下のように依存関係が注入されたサービスを取得します

injector = angular.element($0).injector();
injector.get('$mdToast');

ここに画像の説明を入力してください

于 2018-01-29T11:19:01.670 に答える