$templateCache, $templateRequest, ngInclude 一起玩得很好(呃)
$templateCache, $templateRequest, ngInclude play nice(er) together
我试图在第一个页面查看时获取我的所有部分,以便在查看应用程序期间不会下载 html。
一种方法是在 index.html
.
中使用模板
<script type="text/ng-template" id="templateId.html">
<p>This is the content of the template</p>
</script>
- 这种方式是你有超过 5 个模板
index.html
文件变成
无法管理并破坏了项目的模块结构。
另一种方法是在 .js
文件中包含 html,最有可能在 app.js
中
myApp.run(function($templateCache) {
$templateCache.put('templateId.html', 'This is the content of the template');
});
- 我认为
.js
文件不适合 html 代码,同样的问题
就像在 index.html
. 中一样
我想做的是在不同的文件中有模板,这样我就可以保持我的模块结构并将它们预加载到索引中。
这就是我现在拥有的。
var cmsAppFirstRun = function ($templateCache, $templateRequest, $rootScope) {
$templateRequest('views/common/top-bar.html').then(function (response) {
$templateCache.put('top.bar', response);
$rootScope.templatesDone = true;
});
};
angular.module('cmsApp').run(cmsAppFirstRun);
和html
<div ng-include="'top.bar'" ng-if="$root.templatesDone"></div>
有没有更性感、棱角分明的方式来做到这一点?
在 stack answers 中使用 $http
和 $route
找到了一些技巧。
我觉得最吸引人的是
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});
}
}
})
这样,路由中的所有模板都会首先加载 运行。
编辑:我正在使用 UI Router 所以在 angular.run()
块中看起来有点不同。此处尚未处理嵌套视图。
angular.forEach($state.get(), function(state){
if(state.templateUrl){
$http.get(state.templateUrl, {cache: $templateCache});
}
});
编辑 2:我错过了 $templateRequest,它可以是 angular.run()
块中 html 模板的路径。
$templateRequest('views/cart/modal-confirm-continue-printing.html');
$templateRequest('views/cart/modal-confirm-trash.html');
编辑 3:由于我使用 g运行t 构建应用程序,我发现 https://www.npmjs.com/package/grunt-angular-templates 对自动化此过程很有用。
不确定是否可以帮助您,但在我的项目中,我使用 gulp-ngtemplate 生成一个 js 文件,其中包含所有 html 文件作为“$templateCache.put()”指令。
我试图在第一个页面查看时获取我的所有部分,以便在查看应用程序期间不会下载 html。
一种方法是在 index.html
.
中使用模板
<script type="text/ng-template" id="templateId.html">
<p>This is the content of the template</p>
</script>
- 这种方式是你有超过 5 个模板
index.html
文件变成 无法管理并破坏了项目的模块结构。
另一种方法是在 .js
文件中包含 html,最有可能在 app.js
中
myApp.run(function($templateCache) {
$templateCache.put('templateId.html', 'This is the content of the template');
});
- 我认为
.js
文件不适合 html 代码,同样的问题 就像在index.html
. 中一样
我想做的是在不同的文件中有模板,这样我就可以保持我的模块结构并将它们预加载到索引中。
这就是我现在拥有的。
var cmsAppFirstRun = function ($templateCache, $templateRequest, $rootScope) {
$templateRequest('views/common/top-bar.html').then(function (response) {
$templateCache.put('top.bar', response);
$rootScope.templatesDone = true;
});
};
angular.module('cmsApp').run(cmsAppFirstRun);
和html
<div ng-include="'top.bar'" ng-if="$root.templatesDone"></div>
有没有更性感、棱角分明的方式来做到这一点?
在 stack answers 中使用 $http
和 $route
找到了一些技巧。
我觉得最吸引人的是
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});
}
}
})
这样,路由中的所有模板都会首先加载 运行。
编辑:我正在使用 UI Router 所以在 angular.run()
块中看起来有点不同。此处尚未处理嵌套视图。
angular.forEach($state.get(), function(state){
if(state.templateUrl){
$http.get(state.templateUrl, {cache: $templateCache});
}
});
编辑 2:我错过了 $templateRequest,它可以是 angular.run()
块中 html 模板的路径。
$templateRequest('views/cart/modal-confirm-continue-printing.html');
$templateRequest('views/cart/modal-confirm-trash.html');
编辑 3:由于我使用 g运行t 构建应用程序,我发现 https://www.npmjs.com/package/grunt-angular-templates 对自动化此过程很有用。
不确定是否可以帮助您,但在我的项目中,我使用 gulp-ngtemplate 生成一个 js 文件,其中包含所有 html 文件作为“$templateCache.put()”指令。