AngularJS使用自定义指令替代ng-repeat的方法


Posted in Javascript onSeptember 17, 2016

前言

大家都知道对于处理小数量,ng-repeat是非常有用的,但是如果需要处理非常大的数量集,还是采用自定义的方法更好一些。特别是数据大多都是静态的或已预存储好的,这个时候应避免使用ng-repeat指令。

ng-repeat中的表达式和 $watch

Angular中的表达式都会创建$watch Scope 函数。用于监听模型变化,当你的模型部分发生变化时它会通知你。在ng-repeat指令中,如果某行数据有15列数据都绑定了表达式,如果数据有1000多行的话,那么$watch就又奖金15000个,这性能简直难以想象。

所以当我们想要实现ng-repeat的功能又想兼备性能,那只能另找一种方法了。

替换ng-repeat的方法

如果内容是静态的,我们不需要两种方式的绑定,只需要执行一次赋值语句{{::value}}就可以。如果anguluarJS是1.3以下的旧版本,是不支持的一次性绑定语法的。那么最好的方法就是自定义指令,换言之,静态数据可以使用一些简单的方法来格式化。

实现步骤

1、首先创建无序列表,用于保存动态绑定的内容。

创建UL标签作为容器用于显示列表

我们选择动态加载List中的数据,首先添加div标签,并命名为"repeater-alternative"用于渲染流中。

<div>
 <ul>
  <div repeater-alternative></div>
 </ul>
</div>

2、定义List 数据:

//示例数据
var studentsList = 
[
 {
  FirstName: "Raj,
  LastName : "B",
  Country : "India",
  BirthDate: "01/01/1990"
 },
 {
  FirstName: "Kumar,
  LastName : "S",
  Country : "India",
  BirthDate: "01/01/1990"
 },
 ..................
 ..................
 ..................
 ..................
];

$scope.collectionObject = studentsList; //分配给$scope函数

3、实际List内容

主要目的适用于重复集合对象,并显示到列表中,所以需要制定访问循环的逻辑,并按照需求来格式化字符串。

var tableRow = "";
angular.forEach($scope.collectionObject, function (item) {
  tableRow = tableRow + ['<li>',
  '<div class="col-md-1">' + item.FirstName + '</div> ',
  '<div class="col-md-1 ">' + item.LastName + '</div> ',
  '<div class="col-md-1 ">' + item.Country+ '</div> ',
  '<div class="col-md-1 ">' + item.Id + '</div> ',
  '<div class="col-md-1 ">' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '</div> ',
  '</li>'].join('');
});

4、List格式化逻辑

一旦collectionObject的值已被赋给其他变量,就需要定义显示数据的表格。

5、如何获取分配CollectionObject的时间

Angular会监控$scope变量值得改变,一旦值被修改,则$watch将被处罚,所以需要将CollectionObject赋值逻辑放到$scope变量的$watch中。

代码如下:

$scope.$watch($scope.object, function (oldValue, newValue) { 
})

即,当我们执行赋值语句是,Angular会处理这个事件,并格式化List的内容。

$scope.$watch('collectionObject', function (oldValue, newValue) {
 var tableRow = "";
 angular.forEach($scope.collectionObject, function (item) {
  tableRow = tableRow + ['<li>',
  '<div class="col-md-1">' + item.FirstName + '</div> ',
  '<div class="col-md-1 ">' + item.LastName + '</div> ',
  '<div class="col-md-1 ">' + item.State + '</div> ',
  '<div class="col-md-1 ">' + item.Id + '</div> ',
  '<div class="col-md-1 ">' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '</div> ',
  '</li>'].join('');
 });
})

接下来就是将内容渲染到表格控件中,也就是HTML<DIV>repeater-alternative标签中。
首先必须理解Angular的Directive机制,简单而言,就是我们来指示Angular,当指定的变量被发现,就开始执行后台操作。

var userDirectives = angular.module([]);

userDirectives.directive('DOMElementFound', function () {
 return {
  replace: true,
  link: function ($scope, $elem, attrs) {
     //后台处理操作  }
 }
});

我们会通知Angular,当发现"repeater-alternative" 元素,则将以下数据渲染到列表行中。

代码如下:

var userDirectives = angular.module([]);

userDirectives.directive('repeaterAlternative', function () {
 return {
  replace : true,
  link: function ($scope, $elem, attrs) {

   $scope.$watch('collectionObject', function (oldValue, newValue) {
    var tableRow = "";
    angular.forEach($scope.collectionObject, function (item) {
     tableRow = tableRow + ['<li>',
         '<div class="col-md-1">' + item.FirstName + '</div> ',
         '<div class="col-md-1 ">' + item.LastName + '</div> ',
         '<div class="col-md-1 ">' + item.State + '</div> ',
         '<div class="col-md-1 ">' + item.Id + '</div> ',
         '<div class="col-md-1 ">' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '</div> ',
         '</li>'].join('');
    });

    
    //If IE is your primary browser, innerHTML is recommended to increase the performance
    $elem.context.innerHTML = tableRow;
    //If IE is not your primary browser, just appending the content to the element is enough .
    //$elem.append(tableRow);
   });
  }
 }
});

总结

在本文中,主要模拟了ng-repeat的工作方式和逻辑,但只限于静态内容,所以输出结果与调用ng-repeat结果相同,但是渲染更快,因为该方法只有一种数据绑定方式和少量的$watch。以上就是这篇文章的全部内容,希望本文的内容能对大家的学习或者工作有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JavaScript 关键字屏蔽实现函数
Aug 02 Javascript
JavaScript获取某年某月的最后一天附截图
Jun 23 Javascript
JQuery包裹DOM节点的方法
Jun 11 Javascript
jquery插件jquery.confirm弹出确认消息
Dec 22 Javascript
JavaScript实现身份证验证代码
Feb 17 Javascript
weUI应用之JS常用信息提示弹层的封装
Nov 21 Javascript
vue实现列表的添加点击
Dec 29 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
Feb 10 Javascript
JavaScript禁止微信浏览器下拉回弹效果
May 16 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
Aug 01 Javascript
vue.js实现简单轮播图效果
Oct 10 Javascript
Vue开发中常见的套路和技巧总结
Nov 24 Vue.js
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
Sep 17 #Javascript
AngularJS中关于ng-class指令的几种实现方式详解
Sep 17 #Javascript
AngularJS中过滤器的使用与自定义实例代码
Sep 17 #Javascript
利用js编写响应式侧边栏
Sep 17 #Javascript
各式各样的导航条效果css3结合jquery代码实现
Sep 17 #Javascript
JavaScript编写一个简易购物车功能
Sep 17 #Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
Sep 17 #Javascript
You might like
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
详解js闭包
2014/09/02 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
Python实现备份文件实例
2014/09/16 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
python代码实现猜拳小游戏
2020/11/30 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
校庆活动策划方案
2014/06/05 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
2014年妇联工作总结
2014/11/21 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
2015年化验室工作总结
2015/04/23 职场文书
部门主管竞聘书
2015/09/15 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python