我有一个使用ui-router进行路由的angularjs项目.我正在使用$state.reload()
重新加载当前状态并且它工作得很好,除了在我的开发系统中我希望$state.reload()
还重新加载html模板以反映新的更改而无需重新加载整页.
有没有黑客或选择这样做?
更新:
Chris T的解决方案几乎可以工作,但我已经templateFactoryDecorator
在模板URL中添加了缓存破坏程序.
function configureTemplateFactory($provide) { // Set a suffix outside the decorator function var cacheBuster = Date.now().toString(); function templateFactoryDecorator($delegate) { var fromUrl = angular.bind($delegate, $delegate.fromUrl); $delegate.fromUrl = function (url, params) { if (url !== null && angular.isDefined(url) && angular.isString(url)) { url += (url.indexOf("?") === -1 ? "?" : "&"); url += "v=" + cacheBuster; } return fromUrl(url, params); }; return $delegate; } $provide.decorator('$templateFactory', ['$delegate', templateFactoryDecorator]); }
所以
$templateCache.remove($state.current.templateUrl);
没用,我不得不用
$templateCache.removeAll();
它不理想,但对于开发环境来说还可以.
在内部,UI-Router 利用$ templateCache服务来避免重新获取模板.在调用之前$state.reload()
,清除要从服务器重新提取的模板.
假设您想从控制器执行此操作:
function MyController($scope, $templateCache, $state) { $scope.reload = function() { $templateCache.remove("/path/to/template.html"); $state.reload(); } }
文档:
$ templateCache
$ cacheFactory
另外,我发现你想要从服务器重新获取模板很奇怪.