AngularJS模板加载用法详解


Posted in Javascript onNovember 04, 2016

本文实例讲述了AngularJS模板加载用法。分享给大家供大家参考,具体如下:

angular模板加载 ----ng-template

AngularJS作为mvc(或者说mvvm)框架,同样具备模板这一基本概念。

NG加载模板的顺序为 内存加载---AJAX加载。

内存加载

如果之前使用过Bootstrap 插件的ng版,即angular-ui,就会了解到这种方式的具体应用。模板本质上是字符串,把字符串直接写入内存,加载时直接从内存获取,速度会更快,有两种方式显式启用内存加载。

通过使用 $templateCache service来实现

angular.module('myApp', [])
 .controller('myCtrl', ['$scope','$templateCache', function($scope,$templateCache){
    var tmp = '<h4>lovestory</h4>'
       + '<p>这是直接调用$templateCache服务获取模板文件的方式</p>'
       + '<a href="http://www.baidu.com">服务启用templateCache方式</a>';
    $templateCache.put('lovestory.html',tmp);
  }])

$templateCache 服务put方法负责向内存写入模板内容。

通过 script 标签引入

<script type="text/ng-template" id="lovestory.html">
  <h4>lovestory</h4>
  <p>这是script标签获取模板文件的方式</p>
  <a href="http://www.baidu.com">标签启用templateCache方式</a>
</script>

这里需要注意, type="text/ng-template" 是指明这是ng模板,id属性是指实际使用模板时的一个引用,标签之间的内容才是实际的模板内容。而且,需要注意,id绝对不是URL,这个 script 标签绝对不会发出HTTP请求,具体讨论见最后。

实际应用模板时候,使用 ID 属性,即可从内存中获取对应数据。

<div ng-include="'lovestory.html'" class="well"></div>

使用 ng-include 的时候,应该注意,id相当于一个字符串,不是ng-expression ,所以不要忘了加单引号。

AJAX加载

上述的内存加载,相当于一个预定义模板,定义在 client-side ,不会与服务器有任何交互,适合变化频率低的模板。

当NG在内存中找不到对应模板时,就会启用AJAX请求,去拉取对应模板。假设项目入口文件地址为 http://127.0.0.1/index.html ;

<div ng-include="'lovestory.html'" class="well"></div>

在指令中同样可以使用,templateUrl对应值

angular.module('myApp', [])
 .directive('templateDemo', ['$log', function($log){
  return {
  restrict: 'A', // E = Element, A = Attribute, C = Class, M = Comment
  templateUrl: 'butterfly.html',
  replace: true,
  link: function($scope, iElm, iAttrs, controller) {}
  }
 }])

内存中没有对应模板时,AJAX请求地址为 http://127.0.0.1/lovestory.html , 请求成功后将对应内容写入 $templateCache ,在页面不进行刷新,不手动删除的情况下,写入的内容不会丢失。而且,务必记住,AJAX是有缓存控制的。。。

内存模板优点

在雅虎前端优化34条里,有一条是“合并压缩文件”。

合并压缩文件可以减小HTTP请求量,又可以减小网络传输量,对于路径依赖并不严重的JS,CSS文件完全是必备,因为各JS,CSS文件开发时分割为不同的文件,实现各自的功能需求,上线时合并即可,但是,HTML文件可以压缩,但是无法合并,因为路径依赖严重。

以我为学习Angularjs而做的个人博客练习 路由为例:

angular.module('administratorApp',[])
 .config(function ($routeProvider,$locationProvider) {
  $locationProvider.html5Mode(false);
  $routeProvider
   .when('/manage', {
    templateUrl: 'views/manage.html',
    controller: 'ManageCtrl'
   })
   .when('/diary/:key', {
    templateUrl: 'views/diaryDetail.html',
    controller: 'DiaryDetailCtrl',
   })
   .when('/diary', {
    templateUrl: 'views/diaryList.html',
    controller: 'DiaryListCtrl'
   })
   .when('/publish/:key', {
    templateUrl: 'views/update.html',
    controller: 'UpdateCtrl'
   })
   .when('/publish', {
    templateUrl: 'views/publish.html',
    controller: 'PublishCtrl'
   })
   .when('/record', {
    templateUrl: 'views/record.html',
    controller: 'RecordCtrl'
   })
   .otherwise({
    redirectTo: '/diary'
   });
 });

六个控制器需要六个模板,六次HTTP请求加载数据量并不大的模板资源浪费严重。NG的优化方案是,通过虚拟路径取代实体路径,去除掉 server-side 的路径依赖。

好处就是,一个JS文件一次HTTP请求,而不是六次。坏处就是内存压力变大,PC上无所谓,开发web app(mobile)就需要注意几点。

① 移动端内存太脆,尽量不要使用上述所说的预定义模板,因为模板会全部加载到内存中

② AJAX请求完毕,会自动把结果放入cache里,所以需要手动控制.模板与控制器存在对应关系,可以在控制器内部加上如下代码

$scope.$on('$locationChangeStart',function(){
   $templateCache.remove('****.html');
})

③ $routeProvider的 template , templateUrl 可以是函数,通过函数返回值可以控制模板加载。

PS::本人并未涉及到移动端开发,所以此处为思考所得,而且随着手机硬件性能提升,内存不再是个困扰。

$templateCache 方法

$templateCache 基于 cacheFactory 而来,接口保持一致,可以认为

\$templateCache = \$cacheFactory('template');

方法 功能
put 向内存写入模板内容
get 从内存获取模板内容
remove 传入key值,删除对应模板内容
removeAll 删除所有模板内容
destroy 解除key-value对应关系,但不释放内存
info 模板缓存对象的信息

Grunt与ID属性误解

module.exports = function(grunt){
 grunt.initConfig({
  html2js : {
   simple : {
    options : {
     base : '',
     module : 'templateStore'
    },
    files : [{
     src : ['views/*.html'],
     dest : 'build/scripts/templateStore.js'
    }]
   }
  }
 });
 grunt.loadNpmTasks('grunt-html2js');
 grunt.registerTask('default',['html2js']);
}

这是我目前使用Grunt--html2js的配置方案,目的是将 views 文件夹下的所有模板文件全部放入 templateStore 模块中,各模板对应ID即为路径,生成的部分代码如下:

angular.module("views/diaryList.html", []).run(["$templateCache", function($templateCache) {
 $templateCache.put("views/diaryList.html", '*******'
}]);

这部分代码等效于

<script type="text/ng-template" id="views/diaryList.html">
   ***********
</script>

现在应该明白,id只是个标示,不是URL。。。。。。

AJAX缓存

涉及到部分HTTP Header 和 XHR2 的相关内容,将作为单独篇章后续介绍。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
javascript 新浪背投广告实现代码
Jul 07 Javascript
jQuery 常见学习网站与参考书
Nov 09 Javascript
JS 实现双色表格实现代码
Nov 24 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
Jan 11 Javascript
js实现的类似于asp数据字典的数据类型代码实例
Sep 03 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
JavaScript实现的SHA-1加密算法完整实例
Feb 02 Javascript
json与jsonp知识小结(推荐)
Aug 16 Javascript
jQuery 选择器(61种)整理总结
Sep 26 Javascript
JS动态给对象添加属性和值的实现方法
Oct 21 Javascript
JS实现商品筛选功能
Aug 19 Javascript
jquery插件开发模式实例详解
Jul 20 jQuery
jQuery 遍历map()方法详解
Nov 04 #Javascript
Sortable.js拖拽排序使用方法解析
Nov 04 #Javascript
jQuery图片加载显示loading效果
Nov 04 #Javascript
JavaScript 深层克隆对象详解及实例
Nov 03 #Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
Nov 03 #Javascript
简单学习vue指令directive
Nov 03 #Javascript
Vue.js常用指令汇总(v-if、v-for等)
Nov 03 #Javascript
You might like
关于文本留言本的分页代码
2006/10/09 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php数组去除空值函数分享
2015/02/02 PHP
js中有关IE版本检测
2012/01/04 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
2019/09/05 Javascript
python服务器与android客户端socket通信实例
2014/11/12 Python
对于Python装饰器使用的一些建议
2015/06/03 Python
python读写json文件的简单实现
2017/04/11 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
python pygame实现2048游戏
2018/11/20 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
python 串行执行和并行执行实例
2020/04/30 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
工商企业管理应届生求职信
2014/05/04 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
学年个人总结范文
2015/03/05 职场文书