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

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

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

引言

本文主要介绍了另一种即具有与 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年,是全球最大的控件提供商,也是微软认证的金牌合作伙伴。

    相关推荐

    JavaScript中常用数据类型,你知道几个?

    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师Lison这篇文章我们了解一下JavaScript中现有的八个数据类型,当然这并不是JavaScr...

    踩坑:前端的z-index 之bug一二(zh1es前端)

    IE6下浮动元素bug给IE6下的一个div设置元素样式,无论z-index设置多高都不起作用。这种情况发生的条件有三个:1.父标签position属性为relative;2.问题标签无posi...

    两栏布局、左边定宽200px、右边自适应如何实现?

    一、两栏布局(左定宽,右自动)1.float+margin即固定宽度元素设置float属性为left,自适应元素设置margin属性,margin-left应>=定宽元素宽度。举例:HTM...

    前端代码需要这样优化才是一个标准的网站

      网站由前端和后端组成,前端呈现给用户。本文将告诉您前端页面代码的优化,当然仍然是基于seo优化的。  就前端而言,如果做伪静态处理,基本上是普通的html代码,正常情况下,这些页面内容是通过页面模...

    网页设计如何自学(初学网页设计)

    1在Dreamweaver中搭建不同的页面,需要掌握HTML的语句了,通过调整各项数值就可以制作出排版漂亮的页面,跟着就可以学习一些可视化设计软件。下面介绍网页设计如何自学,希望可以帮助到各位。Dre...

    1、数值类型(数值类型有)

    1.1数据类型概览MySQL的数据类型可划分为三大类别:数值类型:旨在存储数字(涵盖整型、浮点型、DECIMAL等)。字符串类型:主要用于存储文本(诸如CHAR、VARCHAR之类)。日期/...

    网页设计的布局属性(网页设计的布局属性是什么)

    布局属性是网站设计中必不可少的一个重要的环节,主要用来设置网页的元素的布局,主要有以下属性。1、float:该属性设置元素的浮动方式,可以取none,left和right等3个值,分别表示不浮动,浮在...

    Grid网格布局一种更灵活、更强大的二维布局模型!

    当涉及到网页布局时,display:flex;和display:grid;是两个常用的CSS属性,它们都允许创建不同类型的布局,但有着不同的用法和适用场景。使用flex布局的痛点当我们使...

    React 项目实践——创建一个聊天机器人

    作者:FredrikStrandOseberg转发链接:https://www.freecodecamp.org/news/how-to-build-a-chatbot-with-react/前言...

    有趣的 CSS 数学函数(css公式)

    前言之前一直在玩three.js,接触了很多数学函数,用它们创造过很多特效。于是我思考:能否在CSS中也用上这些数学函数,但发现CSS目前还没有,据说以后的新规范会纳入,估计也要等很久。然...

    web开发之-前端css(5)(css前端设计)

    显示控制一个元素的显示方式,我们可以使用display:block;display:inline-block;display:none;其中布局相关的还有两个很重要的属性:display:flex;和...

    2024最新升级–前端内功修炼 5大主流布局系统进阶(分享)

    获课:keyouit.xyz/14642/1.前端布局的重要性及发展历程前端布局是网页设计和开发的核心技能之一,它决定了页面元素如何组织和呈现。从早期的静态布局到现代的响应式布局,前端布局技术经历了...

    教你轻松制作自动换行的CSS布局,轻松应对不同设备!

    在网页设计中,自动换行的CSS布局是非常常见的需求,特别是在响应式设计中。它可以让网页内容自动适应不同屏幕尺寸,保证用户在不同设备上都能够获得良好的浏览体验。本文将介绍几种制作自动换行的CSS布局的方...

    晨光微语!一道 CSS 面试题,伴你静享知识治愈时光

    当第一缕阳光温柔地爬上窗台,窗外的鸟鸣声清脆悦耳,空气中弥漫着清新的气息。在这宁静美好的清晨与上午时光,泡一杯热气腾腾的咖啡,找一个舒适的角落坐下。前端的小伙伴们,先把工作的疲惫和面试的焦虑放在一边,...

    2023 年的响应式设计指南(什么是响应式设计优缺点)

    大家好,我是Echa。如今,当大家考虑构建流畅的布局时,没有再写固定宽度和高度数值了。相反,小编今天构建的布局需要适用于几乎任何尺寸的设备。是不是不可思议,小编仍然看到网站遵循自适应设计模式,其中它有...