有使用AngularJS路由时预加载模板的方法吗?

Angular应用程序加载后,我需要一些模板脱机使用。

像这样的东西将是理想的:

$routeProvider .when('/p1', { controller: controller1, templateUrl: 'Template1.html', preload: true }) 

有一个模板caching服务 : $ templateCache ,可以用来在JavaScript模块中预加载模板。

例如,从文档中提取:

 var myApp = angular.module('myApp', []); myApp.run(function($templateCache) { $templateCache.put('templateId.html', 'This is the content of the template'); }); 

甚至有一个grunt任务可以从html文件中预先生成一个javascript模块: grunt-angular-templates

另一种方式,也许不那么灵活,就是使用内联模板 ,例如,在你的index.html中有一个像这样的脚本标签:

 <script type="text/ng-template" id="templates/Template1.html">template content</script> 

意味着模板可以稍后以与路由configuration中的真实url相同的方式寻址( templateUrl: 'templates/Template1.html'

这是@gargc的答案的补充。

如果你不想使用script标签来指定你的模板,并且想从文件中加载模板,你可以这样做:

  myApp.run(function ($templateCache, $http) { $http.get('Template1.html', { cache: $templateCache }); }); myApp.config(function ($locationProvider, $routeProvider) { $routeProvider.when('/p1', { templateUrl: 'Template1.html' }) }); 

基于拉曼·萨维茨基(Raman Savitski)的方法,我想我已经稍微改进了这个问题的解决scheme,但它有select地加载模板。 它实际上允许这样要求的原始语法:

$routeProvider.when('/p1', { controller: controller1, templateUrl: 'Template1.html', preload: true })

这允许你只是装饰你的路线,而不必担心在别的地方更新另一个预加载configuration。

这里是开始运行的代码:

 angular.module('MyApp', []).run([ '$route', '$templateCache', '$http', (function ($route, $templateCache, $http) { var url; for (var i in $route.routes) { if ($route.routes[i].preload) { if (url = $route.routes[i].templateUrl) { $http.get(url, { cache: $templateCache }); } } } }) ]); 

预加载模块路由中定义的所有模板。

 angular.module('MyApp', []) .run(function ($templateCache, $route, $http) { var url; for(var i in $route.routes) { if (url = $route.routes[i].templateUrl) { $http.get(url, {cache: $templateCache}); } } }) 

如果将每个模板包装在脚本标签中,例如:

 <script id="about.html" type="text/ng-template"> <div> <h3>About</h3> This is the About page Its cool! </div> </script> 

将所有模板连成一个大文件。 如果使用Visual Studio 2013,请下载Web Essentials – 它会添加一个右键菜单来创build一个HTML Bundle

添加这个人写的代码来改变angular度$ templatecache服务 – 它只有一小块代码,它的工作原理:-)

https://gist.github.com/vojtajina/3354046

你的路线templateUrl应该是这样的:

  $routeProvider.when( "/about", { controller: "", templateUrl: "about.html" } );