我想通过使用UI-ROUTER RESOLVE属性来显示其直接范围之前要解决一个API调用,但是我的解决属性取决于OclazyLoad已解决的文件。因此,我遇到了此错误Error: [$injector:unpr] Unknown provider: SavedFactoryProvider <- SavedFactory
这是我的代码
$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();
}]
}
});
谢谢!
路由解析器与$q.all
并行解析。由于 $ocLazyLoad.load(...)
是异步的,因此在调用 searches
时肯定不会完成。
$ocLazyLoad.load(...)
返回一个可以束缚以避免种族条件的承诺,例如:
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();
});
}
与Ngroute相反,UI路由器支持层次结构;依赖关系的图正在建立在状态变化上。解决方案的顺序可以取决于其依赖性。因此,searches
应将loadFiles
列为其依赖性:
searches: function(loadFiles, $injector) {
var SavedFactory = $injector.get('SavedFactory');
return SavedFactory.getSavedSearches();
}
$injector.get
显然是必要的,因为UI路由器如何在内部调用解析器功能。