Javascript 将以前检索到的信息传递给AngularJS中的templateProvider
我正在使用AngularJS 1.3和UI路由器。我有一个状态,其中我有一个解析和一个模板提供程序 我试图实现的是,在解析中从数据库检索到的信息可以被templateProvider使用。现在,我必须获得两次信息,一次来自resolve,另一次来自templateProvider,这很烦人 守则:Javascript 将以前检索到的信息传递给AngularJS中的templateProvider,javascript,angularjs,node.js,express,Javascript,Angularjs,Node.js,Express,我正在使用AngularJS 1.3和UI路由器。我有一个状态,其中我有一个解析和一个模板提供程序 我试图实现的是,在解析中从数据库检索到的信息可以被templateProvider使用。现在,我必须获得两次信息,一次来自resolve,另一次来自templateProvider,这很烦人 守则: .state('articleurl', { url: '/:articleUrl', resolve: { artic
.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次调用
谢谢 我认为您可以直接注入已解析的变量,因此您可以在
templateProvider
中注入article
:
.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', 'article', function ($templateFactory, $stateParams, $http, article) {
// Now here you can use article without the need to re-call it
}],
controller: 'ArticlesViewController'
})
将其用作文章($stateParams.articleUrl)。然后(…)
在这两个位置,这将保持物品干燥。通过将$cacheFactory
替换为,您可以更好地控制缓存(例如过期)
$http
也可以成功使用,而不是显式缓存:
如果对同一URL有多个GET请求,则
使用相同的缓存进行缓存,但缓存尚未填充,仅
将向服务器发出一个请求,其余请求将被删除
可以使用来自第一个请求的响应来实现
可以使用
ng include
作为模板,将src
从controllerI传递给它我试图避免这种方法,以便直接从state加载模板,但如果我无法解决此问题,很可能我将不得不使用这种方法。恐怕不行。我试着给它注射,但它不只是起作用…:(哦,是的,这很有魅力。现在它只向数据库发出一个请求=)谢谢!
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
})
);
};
});