2017-12-17 25 views
2

api呼び出しを解決するには、ui-router resolveプロパティを使用して簡単に表示する前に解決する必要がありますが、解決プロパティはocLazyLoadで解決されます。だから、私はError: [$injector:unpr] Unknown provider: SavedFactoryProvider <- SavedFactoryocLazyLoad解決されたファイルをui-routerで解決する方法

このエラーを取得してこれが私のコード

$stateProvider.state('app.saved', { 
    url: '/saved', 
    templateUrl: 'app/modules/saved/views/saved.html', 
    controller: 'SavedSearchCtrl', 
    resolve: { 
     loadFiles: ['$ocLazyLoad', function($ocLazyLoad) { 
     return $ocLazyLoad.load([{ 
      name: 'app.saved', 
      files: [ 
      'app/modules/saved/controller.js', 
      'app/modules/saved/factory.js', 
      ], 
      cache: false 
     }]); 
     }], 
     searches: ['loadFiles', 'SavedFactory', function(loadFiles, SavedFactory) { 
     return SavedFactory.getSavedSearches(); 
     }] 
    } 
}); 

ありがとうです!

答えて

2

ルートリゾルバは、$q.allと並行して解決されます。 $ocLazyLoad.load(...)は非同期なので、searchesが呼び出された時点では必ず完了しません。

$ocLazyLoad.load(...)

は、競合状態を避けるために連鎖させることができますされた約束を返し、何かのように:ngRouteとは対照的に

searches: function($ocLazyLoad, $injector) { 
    return $ocLazyLoad.load([ 
     { 
     name: 'app.saved', 
     files: [ 
      'app/modules/saved/controller.js', 
      'app/modules/saved/factory.js', 
     ], 
     cache: false 
     } 
    ]) 
    .then(function() { 
     var SavedFactory = $injector.get('SavedFactory'); 
     return SavedFactory.getSavedSearches(); 
    }); 
    } 

、UIルータはリゾルバの階層をサポートしています。状態の変化に応じて依存関係のグラフが構築されています。解決される順序は、依存関係によって決まります。だから、searchesは、その依存関係として​​をリストする必要があります。

searches: function(loadFiles, $injector) { 
    var SavedFactory = $injector.get('SavedFactory'); 
    return SavedFactory.getSavedSearches(); 
    } 

$injector.getが原因UIルータが内部リゾルバ機能を呼び出す方法を実際に明らかに必要です。

+0

こんにちは@estusそれは完璧に動作しています。私はこの同じアプローチで何をしているのか2つを解決したいとします。 –

+0

ngRouteではなく、UIルータを使用していることを見落としました。それは簡単で、複数のリゾルバ依存関係を持つ問題を解決します。答えを更新しました。 – estus

+0

いいえ、私は前にそれを試しました、私は私の質問が更新されました。私が何か間違いを犯したかどうか見てください、ありがとう@ estus –

関連する問題