45

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

这样比较理想:

$routeProvider($route提供者).当('/p1'{控制器:控制器1,templateUrl:“Template1.html”,预加载:true})
1

5个答案5

重置为默认值
57

这是对@gargc答案的补充。

如果不想使用脚本标记指定模板,并且想从文件加载模板,可以这样做:

myApp.run(函数($templateCache,$http){$http.get('Template1.html',{cache:$templateCache});});myApp.config(函数($locationProvider,$routeProvider){$routeProvider.when('/p1',{templateUrl:'Template1.html'})});
6
  • 8
    顺便说一句,$http.get('Template1.html',{cache:$templateCache});应该有同样的效果。尽管如此,这并没有太大区别:)
    – 加斯特
    评论 2013年9月10日15:53
  • 1
    这绝对是一个比我建议的更简单的选择。再次感谢:)
    – 安德什
    评论 2013年9月11日7:11
  • 2
    我更喜欢这种解决方案,因为它不需要从HTML模板构建JavaScript文件。 评论 2013年12月17日4:30
  • 这一行“$http.get('Template1.html',{cache:$templateCache});”也意味着将其添加到角度缓存中? 评论 2016年12月19日10:03
  • 我已经尝试过了,但由于http.get是异步的,我的模板还没有加载到我迫切需要的位置。有人知道如何解决这个问题吗?
    – 僵硬
    评论 2017年1月11日13:03
45

有一个模板缓存服务:$templateCache它可以用于在javascript模块中预加载模板。

例如,取自文档:

var myApp=角度模块('myApp',[]);myApp.run(函数($templateCache){$templateCache.put('templateId.html','这是模板的内容');});

甚至还有一个从html文件预生成javascript模块的任务:咕哝角模板

另一种可能不太灵活的方法是使用内联模板例如,在index.html中有这样的脚本标记:

模板内容

意味着稍后可以使用与路由配置中的实际url相同的方式处理模板(templateUrl:'模板/Template1.html')

5
  • 1
    谢谢,正是我要找的!我真的希望能够在$templateCache.put()中指定模板文件,脚本标记替代项会搞乱我的IDE,我没有使用grunt。我最终使用了$http。有关详细信息,请参阅我自己的答案。
    – 安德什
    评论 2013年9月10日13:26
  • 我还没有测试Grunt插件,但。。。它也包括控制器吗?还是仅仅是模板?为了快速加载视图,最好预先加载所有可能的内容。谢谢! 评论 2014年5月7日1:33
  • +1表示内联模板。内联模板允许更快的初始加载,但具有稍后替换内容的灵活性。
    – 麋鹿
    评论 2014年8月7日13:07
  • @德瑞尔wc:我现在正在努力解决相反的问题。我有一个项目,是用一个grunt生成器(grunt-angular-fullstack)创建的,它自动包含并配置了许多grunt任务。其中之一是咕哝角模板。由于我想用我的身份验证框架截获来自服务器的加载,我需要向服务器发出请求,但我没有得到它们。所以是的,它还预加载controller.js文件。 评论 2014年9月5日7:25
  • 13
    如果需要从URL获取模板:myApp.run(函数($templateRequest){$templateRequest('/url/to/template.html',true);});
    – 布莱斯
    评论 2015年3月17日9:37
28

我认为我有一个基于Raman Savitski方法的稍微改进的解决方案来解决这个问题,但它有选择性地加载模板。它实际上允许像这样要求的原始语法:

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

这允许您只需装饰路线,而不必担心在其他地方更新另一个预加载配置。

以下是启动时运行的代码:

角度模块('MyApp',[]).run([“$route”,“$templateCache”,“$http”,(函数($route,$templateCache,$http){var-url;for($route.routes中的var i){if($route.routes[i].preload){if(url=$route.routes[i].templateUrl){$http.get(url,{cache:$templateCache});}}}})]);
8
  • 4
    如果有一个明确的预加载:false因此默认情况下为路由启用预加载。但我认为desvision是个人品味,取决于你想做什么。除了那个很棒的片段+1
    – 反科姆
    评论 2014年7月1日7:55
  • 当我写这篇文章时,我只是想从大约20条路由中加载两条预加载:true对我来说效果更好。
    – 用户2740086
    评论 2014年7月1日11:26
  • 1
    这是迄今为止最好的答案。 评论 2015年3月4日15:24
  • 1
    我很高兴在这里看到你的回应。。我一直在努力寻找缓存模板的方法。。谢谢 评论 2015年6月14日4:39
  • 1
    如果你和我一样,在这里寻找使用uiRouter的解决方案,并且喜欢这个想法:试试这个。它将为状态及其定义的任何视图加载模板。
    – 克尼里
    评论 2017年5月4日14:33
18

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

角度模块('MyApp',[]).run(函数($templateCache、$route、$http){var-url;for($route.routes中的var i){if(url=$route.routes[i].templateUrl){$http.get(url,{cache:$templateCache});}}})
2
  • 如果模板的内容动态更改,会发生什么情况?这是正确显示还是将显示来自缓存的相同内容?
    – DMX先生
    评论 2016年10月25日13:58
  • 1
    如果内容是动态的,那么“预加载”是没有意义的。或者我不理解你的情况。 评论 2017年3月24日13:16
0

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

<script id=“about.html”type=“text/ng-template”><div><h3>关于</h3>这是关于页面太酷了!</div></script>

将所有模板连接到一个大文件中。如果使用Visual Studio 2013,请下载Web要点-它会添加右键单击菜单来创建HTML捆绑包

添加这个家伙编写的代码来更改有棱角的$templatecache服务-它只是一小段代码,并且可以工作:-)

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

您的路线templateUrl应如下所示:

$routeProvider.when(当)(“/关于”{控制器:“”,templateUrl:“关于.html”});

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.