百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

AngularJS:如何使用自定义指令取代ng-repeat

zhezhongyun 2025-01-29 19:07 40 浏览

引言

本文主要介绍了另一种即具有与 ng-repeat 一样处理大量数据的绑定的功能,又具有超高的性能。

对于处理小数量,ng-repeat 是非常有用的,但是如果需要处理非常大的数量集,还是采用自定义的方法更好一些。

也别是数据大多都是静态的或已预存储好的,这个时候应避免使用 ng-repeat 指令。

ng-repeat 中的表达式和 $watch

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

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

替换 ng-repeat 的方法

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

实现步骤

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

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

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

  • 定义 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函数

  • 实际 List 内容

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

var tableRow = "";

angular.forEach($scope.collectionObject, function (item) {

tableRow = tableRow + ['

  • ',

    '

    ' + item.FirstName + '
    ',

    '

    ' + item.LastName + '
    ',

    '

    ' + item.Country+ '
    ',

    '

    ' + item.Id + '
    ',

    '

    ' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '
    ',

    '

  • '].join('');

    });

    • List 格式化逻辑

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

    • 如何获取分配 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 + ['

  • ',

    '

    ' + item.FirstName + '
    ',

    '

    ' + item.LastName + '
    ',

    '

    ' + item.State + '
    ',

    '

    ' + item.Id + '
    ',

    '

    ' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '
    ', '
  • '].join('');

    });

    })

    • 接下来就是将内容渲染到表格控件中,也就是HTML

      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 + ['

  • ',

    '

    ' + item.FirstName + '
    ',

    '

    ' + item.LastName + '
    ',

    '

    ' + item.State + '
    ',

    '

    ' + item.Id + '
    ',

    '

    ' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '
    ', '
  • '].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。

    支持 AngularJS 的控件集

    Wijmo天生就支持了 AngularJS 框架,现在 Wijmo 又全球第一个支持 AngularJS 2 框架。Wijmo 中提供了大量的支持 AngularJS 及 AngularJS 2 的Demo。

    Wijmo 是为企业应用程序开发而推出的一系列包含 HTML5 和 JavaScript 的开发控件集。

    它包含 Wijmo 5(先进的JavaScript控件)、Wijmo 3(经典的jQuery小部件)、金融图表、FlexSheet、OLAP。无论您的应用程序是移动端、PC端、还是必须要支持IE6,Wijmo Enterprise 均能满足您的需求。

    免费试用

    请通过以下方式联系葡萄城,获取 Wijmo 的免费试用版及全功能演示:

    微信:GrapeCityDT

    邮件:marketing.xa@grapecity.com

    官网:wijmo.gcpowertools.com.cn

    关于葡萄城控件

    葡萄城是一家跨国软件研发集团,专注控件领域近30年,是全球最大的控件提供商,也是微软认证的金牌合作伙伴。

    相关推荐

    DNF无色流派还在继续,重力之泉龙战八荒测评

    作者:礁石22222前言本篇为115级套装天天鉴栏目,来帮助各位读者对于新版本的装备有一个更清晰的认知。115级套装分为了稀有到太初5个品级,所有套装的稀有品级属性是一致的,从神器开始出现分歧。通过积...

    《暗黑破坏神2重制版》常用符文之语P3

    大家好我是游戏小白,继续补充一下《暗黑破坏神2重制版》常用的符文之语,主要给大家总结一下前期过渡常用符文之语。没看过之前关于符文之语总结的小伙伴可以翻翻前面的文章。1、钢铁符文之语钢铁造价极低但性价比...

    魔兽怀旧服:P1一款法系BIS披风,获取方式隐蔽,需完成875个任务

    在魔兽怀旧服WLK版本,依旧存在许多实用的制造业装备,特别是在P1阶段,制造业装备的耐用性和性价比是最高的,不仅可以帮助玩家快速过渡到团本,甚至还有个别制造业装备超越了团本掉落的强度,除了玩家近期讨论...

    分手类型——过渡阶段

    过度阶段一.内涵:类似于反复期,在这个阶段儿可能会出现两种可能性。1.感性想分手,但理性上舍不得。感性上我完全不想跟他相处,但理性上我又觉得他身上有很多对我有利的,对我未来有机会有利的东西。二.理性...

    《最后的信仰》新手开局保姆级指南职业选择、属性加点与开荒策略

    《最后的信仰》作为类魂动作游戏,开局选择直接影响开荒体验。本文针对新手玩家,从职业特性、属性分配到武器过渡,提炼高效开荒公式,助你避开陷阱,快速掌握战斗节奏。一、职业选择:斗士/盗贼优先,法系/...

    DNF回血秘方揭示,夏日前买必看篇

    作者:辽宁吴彦祖前言(省流速览)夏日礼包购买理由:夏日礼包是DNF四大礼包之一(新春&耕耘&夏日&金秋),错过销售日期后续想获得部分道具难度极大。主打暖暖时装、特色补齐、海量打...

    DNF手游:55级粉装有大作用!强化继承大法,可节省大量幸运符

    55级粉装的自身属性,实际上比较一般,但它可以用来作为“过渡胚子”,能够帮大家节省很多幸运符和宇宙精华!1、强化继承大法因为不断有玩家翻出了55级团本武器,这把武器肯定是当前版本毋庸置疑的版本答案,但...

    魔兽世界50级职业任务装备如何选择,手把手教学

    魔兽世界50级职业任务,我们装备应该如何选择,今天分身一个文章告诉你,我们知道BWL开放,也会开放50级的职业任务,那么50级的职业任务,对某些职业来说还是非常重要的,因为给的装备。有的甚至可以用到7...

    暗牧的T5与散件如何取舍?认准自己的团队地位才最重要

    牧师作为《魔兽世界》中的老牌职业历经许久已经收获了不少的信仰者,而在笔者看来牧师的最大特色便是风格完全不同的三系专精,在TBC时期,Raid本中的牧师大多为神牧,而戒律牧基本只活跃在竞技场和战场上,而...

    DNF:魂异界传说宝珠曝光!属性设计一般般,男枪第五转职专属

    魂异界地下城“炒冷饭”,定位新春活动副本,奖励道具覆盖面广,涉及白金徽章、转职书、矛盾材料等等。解锁魂异界次元等级,还能兑换传说宝珠,属性也逐渐浮出水面,却比较鸡肋,“抠门”发挥的淋漓尽致!太“抠门”...

    SwiftUI入门五:让视图和过渡动起来

    在使用SwiftUI的时候,无论效果在哪里,我们都可以单独的让视图的变化动起来,或者让视图的状态的变化动态化。SwiftUI会为我们处理那些组合的、层叠的以及可中断的动画的复杂性。在这个教程中,我们会...

    DNF:又是变强的一年?2024耕耘礼包提升率揭晓

    作者:assddde前言国服耕耘礼包的内容已经爆料了。对去年拉满耕耘的奶系职业的而言,今年的提升点为纹章加入了1%的增益量增幅。对C而言,今年换装称号中还加入了buff换装词条。而对于错过了新春套的C...

    魔兽世界:TBC第一阶段还有必要刷T4套吗,D3套能否过渡到T5套?

    T4套真的不如D3套?TBC怀旧服P1阶段目前已经走过大半,作为这个阶段装备等级最高的套装T4套装,游戏中有很大争议。比如猎人玩家会选择D3套,直接跳过T4到T5阶段,而法师甚至会选择继续使用T3套装...

    《异世界勇者》390版本开荒&毕业攻略——狂暴战

    虽然说这个版本是防战的本命版本,但是从大家催更的频率来看,狂暴战依旧是碾压的优势,今天给大家分享一下390版本狂暴战的毕业游玩思路,希望对你有帮助。今天给大家带来的是手动速刷版的攻略,想要挂机过本需要...

    飞飞重逢:装备属性卡全攻略,五色神卡助你战力飙升快速获取

    在游戏中,装备属性卡是提升战斗力的关键道具,它能赋予装备特殊的元素属性,不仅大幅提升攻击力,还能针对不同怪物打出克制伤害。属性卡分为火、水、风、土、电五种元素,每种都能为装备附加独特的攻击特效。那么如...