AngularJS 表格:使用 orderBy 和大写筛选器进行排序

⚡ 智能摘要

AngularJS 表格的排序、顺序和文本格式化都依赖于 ng-repeat 指令以及 filter 表达式。本页展示了如何利用 orderBy、uppercase、filter 和 $index 将普通的 HTML 表格转换为动态的、数据驱动的网格。

  • 🧱 结构体: table、tr、td 和 th 标签仍然用于构建网格,因此没有 AngularJS 特有的标记替换标准 HTML。
  • 🔁 人口: ng-repeat 指令遍历作用域对象上的数组,并为找到的每个元素发出一行。
  • ↕️ 排序: orderBy 筛选器按任意键对行进行排序,反向标志可根据需要反转排序方向。
  • 🔤 Formatting: 大写过滤器会将单列首字母大写,而不会更改控制器中的底层数据。
  • 🔎 搜索: 绑定到 ng-model 输入的过滤器会随着读者的输入而缩小可见行数。
  • 🔢 编号: $index 属性提供了一个从零开始的计数器,因此加一即可生成一个易读的行号。
  • 🚀 规模: 超过一千行时,将 limitTo 与分页结合使用。 track 以保持页面响应式。

AngularJS 表

表格是处理网页时 HTML 中使用的常见元素之一。

表格 HTML 使用 HTML 标签设计

  1. 标签——这是用于显示表格的主要标签。
  2. – 此标签用于分隔表内的行。
  3. – 此标签用于显示实际的表格数据。
  4. – 用于表头数据。

使用上述可用的 HTML 标签以及 AngularJS,我们可以更轻松地填充表格数据。简而言之,ng-repeat 指令用于填充表格数据。

本章我们将探讨如何实现这一点。我们还将学习如何使用 orderBy 和 uppercase 过滤器,以及如何使用 $index 属性来显示 AngularJS 表格索引。第一步是编写标记本身。

在表中填充并显示数据

正如我们在本章介绍中所讨论的,在 HTML 页面中创建表格结构的基础保持不变。

表格的结构仍然使用普通的 HTML 标签创建, ,和。但是,数据是使用 AngularJS 中的 ng-repeat 指令填充的。
让我们来看一个简单的例子,了解如何实现 AngularJS 表格。
在这个例子中,

我们将创建一个 AngularJS 表格,其中包含课程主题及其描述。

步骤1) 我们首先要在 HTML 页面中添加“style”标签,以便表格能够显示为正确的表格。

在表中填充并显示数据

  1. 样式标签已添加到 HTML 页面。这是添加 HTML 元素所需的任何格式属性的标准方法。
  2. 我们正在向表中添加两种样式值。
  • 一是我们的AngularJS表格应该有实线边框;
  • 其次,应该为我们的 AngularJS 表格数据添加内边距。

步骤2) 下一步是编写代码来生成表及其数据。

在表中填充并显示数据

<!DOCTYPE html>
<html>
<head>

    <meta chrset="UTF 8">

</head>
<body>
<title>Event Registration</title>
<style>
    table,th,td{
        border: 1px solid grey;
        padding:5px;
    }
</style>
<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="lib/bootstrap.js"></script>
<script src="lib/bootstrap.css"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <table>
        <tr ng-repeat="ptutor in tutorial">
            <td>{{ptutor.Name}}</td>
            <td>{{ptutor.Description}}</td>
        </tr>
    </table>
</div>

<script type="text/javascript">
    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function($scope) {

        $scope.tutorial = [
            {Name:"Controllers",Description :"Controllers in action"},
            {Name:"Models",Description :"Models and binding data"},
            {Name:"Directives",Description :"Flexibility of Directives"}
        ]});
</script>
</body>
</html>

⚠️警告: 此列表与出版内容完全一致,但其中有四行错误。 chrset 拼写错误 charset同时加载了三个 AngularJS 构建版本,这太多了。 lib/bootstrap.jslib/bootstrap.css 不存在。保留 angular.min.js 只。

Code 说明

  1. 我们首先创建一个名为“tutorial”的变量,并一次性为其分配一些键值对。显示表格时,每个键值对都将用作数据。然后将 tutorial 变量分配给范围对象,以便可以从我们的视图中访问它。
  2. 这是创建表的第一步,我们使用标签。
  3. 对于每一行数据,我们都使用“ng-repeat 指令”。该指令使用变量 ptutor 遍历教程范围对象中的每个键值对。
  4. 最后,我们使用标签以及键值对(ptutor.Name 和 ptutor.Descript使用 ion) 显示 AngularJS 表格数据。

如果代码成功执行,则在浏览器中运行代码时将显示以下输出。

输出

在表中填充并显示数据

从上面的输出来看,

  • 我们可以看到表格使用控制器中定义的键值对数组中的数据正确显示。
  • 通过使用“ng-repeat 指令”遍历每个键值对来生成表数据。

原始数据行只是起点,因为过滤器决定了这些行的排序和格式。

AngularJS 内置过滤器

使用 AngularJS 中的内置过滤器来更改数据在表中的显示方式非常常见。我们已经在前面的章节中看到了过滤器的实际作用。在继续之前,让我们快速回顾一下过滤器。

在 AngularJS 中,过滤器用于在将表达式的值显示给用户之前对其进行格式化。例如,“uppercase”过滤器会接收一个字符串输出,并将该字符串格式化,使其所有字符都以大写形式显示。

因此,在下面的例子中,如果变量“TutorialName”的值为“AngularJS”,则以下表达式的输出将是“ANGULARJS”。

{{ TutorialName | uppercase }}

在本节中,我们将更详细地了解如何在表中使用 orderBy 和大写过滤器。

表格中常用的 AngularJS 过滤器

下表比较了 ng-repeat 表达式中最常用的过滤器。

筛选 目的 例如:
orderBy 按键对行进行排序 | orderBy : 'Name'
过滤 保持匹配行 | filter : searchText
大写 将文本大写 | uppercase
小写 降低文本 | lowercase
限制 大写行计数 | limitTo : 25
currency 货币格式 | currency : '$'
日期 日期格式 | date : 'dd MMM yyyy'
设置小数 | number : 2

排序是读者首先要求的筛选条件,因此排序筛选条件紧随其后。

使用 OrderBy 筛选器对表进行排序

此筛选器用于根据表格中的某一列对表格进行排序。在前面的示例中,AngularJS 表格数据的输出如下所示。

控制器 控制器运行情况
型号 模型和绑定数据
指令 指令的灵活性

让我们来看一个例子,了解如何使用“orderBy”过滤器,并根据表格中的第一列对AngularJS表格数据进行排序。

使用 OrderBy 筛选器对表进行排序

<!DOCTYPE html>
<html>
<head>

    <meta chrset="UTF 8">

</head>
<body>
<title>Event Registration</title>
<style>
    table,th,td{
        border: 1px solid grey;
        padding:5px;
    }
</style>
<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="lib/bootstrap.js"></script>
<script src="lib/bootstrap.css"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <table>
        <tr ng-repeat="ptutor in tutorial | orderBy : 'Name'">
            <td>{{ptutor.Name}}</td>
            <td>{{ptutor.Description}}</td>
        </tr>
    </table>
</div>

<script type="text/javascript">
    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function($scope) {

        $scope.tutorial = [
            {Name:"Controllers",Description :"Controllers in action"},
            {Name:"Models",Description :"Models and binding data"},
            {Name:"Directives",Description :"Flexibility of Directives"}
        ]});
</script>
</body>
</html>

Code 说明

  1. 我们使用的代码与创建表格时的代码相同,唯一的不同是这次我们使用了“orderBy”过滤器和 ng-repeat 指令。在本例中,我们表示我们希望按键“Name”对表格进行排序。

如果代码成功执行,则在浏览器中运行代码时将显示以下输出。

输出

使用 OrderBy 筛选器对表进行排序

从输出来看,

  • 我们可以看到,AngularJS 表格中的数据已根据第一列的数据进行了排序。数组的声明顺序为 Controllers、Models、Directives,因此如果没有筛选条件,行将按此顺序显示。应用 orderBy : 'Name' 按字母顺序排列名称值,将指令移到模型之前,生成控制器、指令、模型。

排序 Reverse 以及来自列标题

orderBy 过滤器接受第二个参数。传递 true 反转方向,并将键和该标志都存储在作用域中,允许读者通过单击标题重新对表格进行排序,因为 按引用排序 描述。

<table>
    <tr>
        <th ng-click="sortKey='Name'; reverse=!reverse">Name</th>
        <th ng-click="sortKey='Description'; reverse=!reverse">Description</th>
    </tr>
    <tr ng-repeat="ptutor in tutorial | orderBy : sortKey : reverse">
        <td>{{ptutor.Name}}</td>
        <td>{{ptutor.Description}}</td>
    </tr>
</table>

排序会改变行的顺序。下一个筛选条件会改变单个列的读取方式。

显示带大写字母过滤器的表格

我们还可以使用大写过滤器将 AngularJS 表格中的数据更改为大写。

让我们看一个例子来了解如何实现这一点。

显示带大写字母过滤器的表格

<!DOCTYPE html>
<html>
<head>

    <meta chrset="UTF 8">

</head>
<body>
<title>Event Registration</title>
<style>
    table,th,td{
        border: 1px solid grey;
        padding:5px;
    }
</style>
<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="lib/bootstrap.js"></script>
<script src="lib/bootstrap.css"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <table>
        <tr ng-repeat="ptutor in tutorial">
            <td>{{ptutor.Name | uppercase}}</td>
            <td>{{ptutor.Description}}</td>
        </tr>
    </table>
</div>

<script type="text/javascript">
    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function($scope) {

        $scope.tutorial = [
            {Name:"Controllers",Description :"Controllers in action"},
            {Name:"Models",Description :"Models and binding data"},
            {Name:"Directives",Description :"Flexibility of Directives"}
        ]});
</script>
</body>
</html>

Code 说明

  1. 我们使用的代码与创建表格时的代码相同,唯一的不同是这次我们使用了大写过滤器。我们将此过滤器与“ptutor.Name”结合使用,以便第一列中的所有文本都以大写形式显示。

如果代码成功执行,则在浏览器中运行代码时将显示以下输出。

输出

显示带大写字母过滤器的表格

从输出来看,

  • 我们可以看到,通过使用“大写”过滤器,第一列中的所有数据都以大写字母显示。

格式化列很有用,读者通常希望在列旁边显示行号。

显示表索引 ($index)

要显示表索引,请添加与 $index。

让我们看一个例子来了解如何实现这一点。

显示表索引

<!DOCTYPE html>
<html>
<head>

    <meta chrset="UTF 8">

</head>
<body>
<title>Event Registration</title>
<style>
    table,th,td{
        border: 1px solid grey;
        padding:5px;
    }
</style>
<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="lib/bootstrap.js"></script>
<script src="lib/bootstrap.css"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <table>
        <tr ng-repeat="ptutor in tutorial">
            <td>{{$index + 1}}</td>
            <td>{{ptutor.Name}}</td>
            <td>{{ptutor.Description}}</td>
        </tr>
    </table>
</div>

<script type="text/javascript">
    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function($scope) {

        $scope.tutorial = [
            {Name:"Controllers",Description :"Controllers in action"},
            {Name:"Models",Description :"Models and binding data"},
            {Name:"Directives",Description :"Flexibility of Directives"}
        ]});
</script>
</body>
</html>

Code 说明

  1. 我们使用与创建表相同的代码,唯一的区别是这次我们在表中添加了一个额外的行来显示索引列。在此附加列中,我们使用 AngularJS 提供的“$index”属性,然后使用 +1 运算符来增加每行的索引。

如果代码成功执行,则在浏览器中运行代码时将显示以下输出。

输出

显示表索引

从输出来看,

  • 可以看到又创建了一个列,在这个列中我们可以看到为每一行创建的索引。

一屏只能显示三行数据。但实际的数据集无法做到这一点,因此读者需要一种方法来搜索它。

如何筛选和搜索 AngularJS 表格数据

AngularJS 提供了一个名为“过滤器”的组件 filter它放在 `ng-repeat` 之后,会将数组中的每个元素与一个值进行比较,并仅保留匹配的行。将该值绑定到使用 `ng-model` 的文本框,表格会在读者输入时自动缩小,无需事件处理程序或控制器代码。

添加实时搜索 Box

在表格上方添加一个输入框,并将数组传递给过滤器。这两个输入框共享同一个作用域属性,因此 AngularJS 会在每次按键时重新计算表达式。

<input type="text" ng-model="searchText" placeholder="Search topics">

<table>
    <tr ng-repeat="ptutor in tutorial | filter : searchText">
        <td>{{ptutor.Name}}</td>
        <td>{{ptutor.Description}}</td>
    </tr>
</table>

Code 说明:

  1. 输入框会将输入的内容写入数据中。 searchText 在范围内。
  2. filter : searchText 保留名称或 Description 包含该子字符串,忽略大小写。
  3. 要搜索单个列,请传递一个对象: filter : {Name : searchText}.
  4. 过滤器链,所以 | filter : searchText | orderBy : 'Name' 先进行搜索,然后对幸存者进行排序。

保持大表格响应式

在使用 AngularJS 表格进行开发时,经常会遇到一个问题:数据集非常大,包含上千行数据。 ng-重复 指令会为每一行创建一个作用域和一个监视器,因此页面可能会停止响应。请将行分散到多个页面上,并添加 track by 因此,现有行将被重用,而不是重新构建。

<tr ng-repeat="ptutor in tutorial | filter : searchText | limitTo : 25 track by ptutor.Name">

常见问题

ng-repeat 需要为每一行指定一个唯一的键。两个相同的值会导致重复值错误。添加一个 distinct 属性,或者编写 track 到 $index,这样行的位置就变成了键,而不是值。

是的。传递一个键数组,例如 orderBy: ['Name','DescriptAngularJS 会先根据第一个键进行排序,如果两个键都匹配,则根据第二个键进行排序。在键名前加上减号可以单独反转该键的排序结果。

每个 ng-repeat 行都会暴露 $even 和 $odd 这两个布尔值。将其中一个值与 ng-class 或 ng-if 绑定,即可应用背景颜色,这样无需在表格中添加任何额外的 CSS 选择器,即可生成条纹行。

助理,例如 GitHub 副驾驶 虽然可以快速搭建 ng-repeat 标记,但他们仍然会自行创建脚本路径并拼错属性。请对照以下说明验证每个建议: AngularJS 过滤器参考 船ping.

AI 工具会将 ng-repeat 重写为控制流块,并将过滤器移至管道或信号中。因为 角度方向 没有内置的排序或筛选管道,需要手动检查每个生成的排序和搜索。

总结一下这篇文章: