我可以在ui-router的模板中使用$ templateCache吗?
模板将缓存在resolve部分中,我想在同一状态下使用缓存模板。
$stateProvider
.state('dashboard', {
url: "/dashboard",
template: function($templateCache){
console.log('test 2');
return $templateCache.get('templates/template1.html'); // returns undefined
},
resolve:{
baseTemplates: function($ocLazyLoad) {
// here the template will be cached...
return $ocLazyLoad.loadTemplateFile(['base/dashboard.html']).then(function(){
console.log('test 1');
});
}
}
})
// console prints "test 2" before than "test 1"
更新:( +代码更新)
我认为我的代码的解析部分存在问题。因为它在模板部分之后运行!并且它导致返回$ templateCache.get未定义。
我使用ocLazyLoad插件来缓存模板并返回正确的承诺。
为什么模板不等待解决?
答案 0 :(得分:19)
如何动态设置动态模板的方式不是通过 template
属性,而是 templateProvider
。有一个有效的plunker,这是片段:
// this is a run event (executed after config in fact)
// in which we do inejct a value into $templateCache
.run(function($templateCache){
// this could be lazy... elswhere
$templateCache.put('templates/template1.html'
, '<div><h4>dashboard</h4></div>');
})
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/dashboard');
$stateProvider.state('dashboard', {
url: '/dashboard',
// this is the place where to resolve dynamic template
templateProvider: function($templateCache){
// simplified, expecting that the cache is filled
// there should be some checking... and async $http loading if not found
return $templateCache.get('templates/template1.html');
},
})
});
请参阅:
而且,我会说,不是可以使用$templateCache
,但ui-router
已经使用了它。负责为我们的视图加载模板(来自url,string ...)的主要服务是:
,正如其代码所示,确实使用$templateCache
作为自然优化($templateFactory
code snippet:)
...
/**
* @ngdoc function
* @name ui.router.util.$templateFactory#fromUrl
* @methodOf ui.router.util.$templateFactory
*
* @description
* Loads a template from the a URL via `$http` and `$templateCache`.
*
* @param {string|Function} url url of the template to load, or a function
* that returns a url.
* @param {Object} params Parameters to pass to the url function.
* @return {string|Promise.<string>} The template html as a string, or a promise
* for that string.
*/
this.fromUrl = function (url, params) {
if (isFunction(url)) url = url(params);
if (url == null) return null;
else return $http
.get(url, { cache: $templateCache })
.then(function(response) { return response.data; });
};
...
答案 1 :(得分:3)
好吧,我只是found out您只需将$templateCache
模板的密钥设置为templateUrl
路由属性,就可以了。
答案 2 :(得分:0)
我不知道它是否已经解决,但是,我决定按如下方式更新我的模板。我记得我使用AngularAMD / AngularUIRouter,但templateURL的工作方式相同。我在templateURL中使用函数,在那里我传递&#34; xxx&#34;参数每次都等于一个新日期,这会再次强制页面搜索。我希望我能帮上忙。
.state ('MyReports', {
parent: 'index',
url: '/MyReports/:cd_menu',
views: {
'BodyView': angularAMD.route ({templateUrl: function (params) {
return "MyReportsAction/getTemplate?cd_menu="+ params.cd_menu + "&xxx="+ new Date();
},
controllerUrl: 'js/app/base/controllers/MyReportsController',
controller: 'MyReportsController'})
}
})
完成后,下面的代码按预期工作:
$state.go('MyReports', {'cd_menu': cd_menu});