私は次のようなサービスがあります。
angular.module('app').factory('ExampleService', function(){
this.f1 = function(world){
return 'Hello '+world;
}
return this;
})
私はJavaScriptコンソールからそれをテストして、サービスの関数f1()
を呼び出したいです。
どうやってやるの?
angular.element(document.body).injector().get('serviceName')
AngularJSは依存性注入(DI)を使用して、サービス、ファクトリをコンポーネント、ディレクティブ、その他のサービスに注入します。したがって、サービスを受けるために必要なことは、最初にAngularJSのインジェクタを取得することです(インジェクタはすべての依存関係を関連付けてコンポーネントに提供する責任があります)。
アプリのインジェクタを取得するには、angleが処理している要素から取得する必要があります。たとえば、アプリがbody要素に登録されている場合は、injector = angular.element(document.body).injector()
を呼び出します。
取得したinjector
からinjector.get('ServiceName')
を使えば好きなサービスを手に入れることができます。
この答えでそれについての詳細情報: 角度からインジェクタを取得することはできません
さらにここに: レガシーコードからAngularJSを呼び出す
特定の要素の$scope
を取得するためのもう1つの便利なトリックです。開発者ツールのDOM検査ツールで要素を選択してから、次の行を実行します($0
が常に選択された要素です)。angular.element($0).scope()
まず第一に、あなたのサービスの修正版です。
var app = angular.module('app',[]);
app.factory('ExampleService',function(){
return {
f1 : function(world){
return 'Hello' + world;
}
};
});
これはオブジェクトを返します。ここで新しいことは何もありません。
これをコンソールから取得する方法は次のとおりです。
var $inj = angular.injector(['app']);
var serv = $inj.get('ExampleService');
serv.f1("World");
以前に行っていたことの1つは、app.factoryがユーザーに関数自体またはそれの新しいバージョンを返すと想定することでした。そうではありません。コンストラクタを取得するには、どちらかをしなければなりません
app.factory('ExampleService',function(){
return function(){
this.f1 = function(world){
return 'Hello' + world;
}
};
});
これはExampleServiceコンストラクタを返します。このコンストラクタは次に 'new'を実行する必要があります。
あるいは、
app.service('ExampleService',function(){
this.f1 = function(world){
return 'Hello' + world;
};
});
これはインジェクション時に新しいExampleService()を返します。
@ JustGoschaの答えはその場で出ていますが、アクセスしたいときには入力するのが大変なので、これを私のapp.jsの最後に追加しました。それから私がタイプしなければならないのはhttpサービスを得るためにx = getSrv('$http')
だけです。
// @if DEBUG
function getSrv(name, element) {
element = element || '*[ng-app]';
return angular.element(element).injector().get(name);
}
// @endif
グローバルスコープに追加されますが、デバッグモードの場合のみです。本番コードで終わらないように、@if DEBUG
の中に入れました。 このメソッドを使用して、生成ビルドからデバッグコードを削除します。
Angularjs Dependency Injectionフレームワークは、あなたのアプリモジュールの依存関係をあなたのコントローラに注入する責任があります。これはインジェクターを通して可能です。
あなたは最初にng-appを識別し、関連するインジェクタを入手する必要があります。以下のクエリはDOMであなたのng-appを見つけてインジェクタを取得するために働きます。
angular.element('*[ng-app]').injector()
ただし、クロムでは、以下に示すようにターゲットng-appを指すことができます。そして$0
ハックを使ってangular.element($0).injector()
を発行する
インジェクタを入手したら、以下のように依存性注入サービスを受けます。
injector = angular.element($0).injector();
injector.get('$mdToast');