2

Angular コントローラーとサービスを動的にダウンロードして挿入する Angular のルーティング アーキテクチャの根性を持っています...コントローラー部分は正常に動作し、$route の .resolve プロパティを介して依存サービスをダウンロードしようとしています。

ここで、ページの起動中にスコープ内で宣言されたファクトリがある場合、それは正常に登録され、それを使用するコントローラーは正常に解決されます。

myModule.factory('MyInjectedDep', function() {
    return {};
});

....

MyController = function(MyInjectedDep)

しかし、「実行時」にその依存関係を登録しようとすると (より適切な表現が必要なため)、循環依存エラーが発生します。例えば:

$route.routes[routeItem.route] = {
   resolve: {
      MyInjectedDep: ['$injector', function($injector) {
          // In real code I download/eval this via $http but same behavior occurs
          myModule.factory('MyInjectedDep', function() {
              return {};
          });
      }]
   }
}

したがって、コントローラーが開始されると、次のようになります。

MyController = function(MyInjectedDep)

循環依存エラーが表示されますが、エラー メッセージに依存関係のトレースが表示されませんか?

Error: Circular dependency:

どんなアイデアでも大歓迎

4

1 に答える 1

1

キーは構成時に $provide にラッチされます。構成時に $provide を取得し、それへの参照を維持すると、それを使用してファクトリを次のように登録できます。

$provide.factory.apply(null, ['MyInjectedDep', [function() {
   return {};
]}]);

これを行うために設計されたプロバイダー/サービスがあり、github の他のサンプルから適応されています: https://github.com/afterglowtech/angular-couchPotato

主に AMD からロードするように設計されていますが、おそらく $http で registerXXX 関数を使用するか、少なくともそのコードの関連部分をコピーできます。リポジトリのサイズに惑わされないでください。実際のプロバイダー/サービスは、約 1 ページのコードhttps://github.com/afterglowtech/angular-couchPotato/blob/master/src/couchPotato.jsです。

于 2013-05-29T21:03:50.073 に答える