我正在使用AngularJS 1.3和UI-Router。我有一个决心和templateProvider的状态。
我想要完成的是templateProvider可以使用解析中从数据库检索到的信息。现在,我必须两次获取信息,一次是来自resolve,另一次是来自templateProvider,这很烦人。
编码:
.state('articleurl', {
url: '/:articleUrl',
resolve: {
article: function ($http, $stateParams, $location) {
return $http({
method: 'GET',
url: '/articles/' + $stateParams.articleUrl
})
.then(function (article) {
return article;
}, function (error) {
$location.path('/404');
});
},
loggedin: checkLoggedin
},
templateProvider: ['$templateFactory', '$stateParams', '$http', function ($templateFactory, $stateParams, $http) {
return $http({
method: 'GET',
url: '/articles/' + $stateParams.articleUrl
}).then(function(article) {
if ( article.data.template )
return $templateFactory.fromUrl('articles/views/templates/' + article.data.template + '.html');
else
return $templateFactory.fromUrl('articles/views/templates/news.html');
});
}],
controller: 'ArticlesViewController'
})
如您所见,根据文章的种类,我在templateProvider中加载了另一个模板。此外,我在控制器中使用了该文章的信息,该信息先前已由该州解决。
有没有办法在templateProvider中使用以前在解析中获取的信息,从而避免通过这种方式再次调用数据库?
现在,每个连接正在对数据库进行2次调用。
谢谢!
最佳答案
app.factory('article', function ($cacheFactory){
var articleCache = $cacheFactory('article');
return function (url) {
return articleCache.get(url) || articleCache.put(url, $http({
method: 'GET',
url: '/articles/' + url
})
);
};
});
在两个地方都将其用作
article($stateParams.articleUrl).then(...)
,这会使东西保持干燥。通过将$cacheFactory
替换为angular-cache
,可以更好地控制缓存(例如过期)。$http
own caching也可以成功使用,而不是显式缓存:如果对同一URL有多个GET请求,
使用相同的缓存进行缓存,但尚未填充缓存
将向服务器发出一个请求,其余请求将
使用第一个请求的响应来实现。
关于javascript - 将先前检索到的信息传递给AngularJS中的templateProvider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32760834/