2016-04-05 10 views
1

これを簡単に説明することはできませんが、基本的にはプロバイダとして設定されているため、私のプロジェクトで使用されていたAPIの配列は、最初は空です。さまざまな設定ブロックがAPIオブジェクトを配列に追加することができ、これが機能しているようです。私は毎回console.logを出力し、配列が増えています。サービスが別の場所に注入されたときにアンカープロバイダの設定がリセットされる

私はサービスを別のもの(この場合は$ httpインターセプタ関数)に挿入し、サービスメソッドを使って配列を返すが、空の配列が得られるたびにそれを返す。

私は、すべての設定ブロックが最初に実行され、傍受されている$ http呼び出しがその後に起こっていると思っていたので、傍受されるまでに配列にはAPIがいっぱいになるはずです。

とにかく、ここでいくつかのコード

angular.module('authModule').provider('authService', function(){ 

    var _apis = []; 

    return({ 
     addApi: addApi, 
     $get: instantiateAuth 
    }); 

    function addApi(newApi){ 
     _apis.push(newApi); 
     console.log("API added", _apis); 
    } 

    function instantiateAuth() { 
     return({ 
      getApis: function(){ 
       console.log("Getting APIs", _apis); 
       return _apis; 
      } 
     }); 
    } 

}) 


.config(function($httpProvider){ 

    $httpProvider.interceptors.push(function($log, $rootScope, $q) { 
     return { 
      request: function(config) { 
       var injector = angular.injector(['ng', 'authModule']); 
       var authService = injector.get('authService'); 
       console.log("apis", authService.getApis()); 
      } 
     }; 
    }); 

}); 

そして例のconfigブロック

angular.module('myModule').config(function ($provide, authServiceProvider) { 

    authServiceProvider.addApi({ 
     url: 'https://apiurl.com', 
     other: 'stuff' 
    }); 

    authServiceProvider.addApi({ 
     url: 'https://apiurl2.com', 
     other: 'stuff' 
    }); 

}); 

はそうだ、appApi方法は、configブロック(2回ここ)に呼び出されるたびに、この行を出力配列console.log( "API added"、_apis);最初のコールの後に1つのアイテムを、2番目のコールの後に2つのアイテムを正しく出力します。

このコード(authService.getApis())は、HTTP呼び出しがインターセプトされたときに最初に起動され、空の配列をコンソールに記録します。

本当にありがとうございます。

EDIT:

問題が

VARインジェクタ= angular.injector([ 'NG'、 'authModule'])この行であると思われます。

私のプロバイダは、このような状況が発生するたびにリセット/再作成されるようです。だから、私はインジェクタの使い方を誤解しているかもしれません。私はもともとauthServiceを関数のパラメータに通常の方法で注入していましたが、循環依存を取得していました(私の認証サービスはモーダルウィンドウを開く必要がありますが、角度UIモーダルはHTTPサービスに依存しています。ユーザーが認証された私の認証サービス:()

答えて

3

に確認してくださいはい、angular.injector(['ng', 'authModule'])は、基本的に素人の面で新しいインジェクタインスタンス(アプリケーションインスタンスを、)作成されます。

angular.injector(['authModule']) !== `angular.injector(['authModule']) 

ngモジュールはデフォルトでロードされ、シングルトンサービスは同じインジェクタインスタンス内のシングルトンのみです:

injector.get('authService') === injector.get('authService'); 

しかし

angular.injector(['authModule']).get('authService') !== `angular.injector(['authModule']).get('authService') 

$injector serviceを使用する必要があります(ほぼすべての状況で望ましい振る舞いである)現在のインジェクタのインスタンスを再利用するには、次の

$httpProvider.interceptors.push(function($log, $rootScope, $q, $injector) { 
    return { 
     request: function(config) { 
      var authService = $injector.get('authService'); 
     } 
    }; 
}); 

$injector.getは取得することが知られており、簡単な解決策であります循環依存関係を回避する。

+0

ありがとうございました。 $ injector.has( 'authService')がtrueを返すという事実にもかかわらず、$ injector.get( 'authService')は未定義に戻っていました。私はこれが非常に奇妙なので、代わりに(間違って)angular.injectorを使って試してみました。私はそれをあなたが示した方法で働かせ、それはもはや未定義に戻っていません。理由は分かりませんが、うまくいきました。 – jonhobbs

関連する問題