Chỉ thị ng-repeat của AngularJS với ví dụ
⚡ Tóm tắt thông minh
Chỉ thị `ng-repeat` trong AngularJS sẽ tạo ra một bản sao của một phần tử cho mỗi mục trong một tập hợp được định nghĩa trong phạm vi bộ điều khiển. Nó biến một mảng thành một danh sách, một bảng hoặc bất kỳ cấu trúc đánh dấu lặp lại nào mà không cần viết vòng lặp thủ công.

Chỉ thị ng-repeat trong AngularJS
ng-lặp lại Chỉ thị Trong AngularJS, ng-repeat được sử dụng để hiển thị các giá trị lặp lại được định nghĩa trong controller. Đôi khi chúng ta cần hiển thị một danh sách các mục trong view, và ng-repeat sẽ hiển thị danh sách được định nghĩa trong controller lên trang view.
⚠️ Thông báo hỗ trợ: AngularJS đã đạt đến Hết hạn sử dụng vào ngày 31 tháng 12 năm 2021. và không nhận được thêm bản vá lỗi hoặc bản sửa lỗi bảo mật nào nữa. Chỉ thị bên dưới vẫn chính xác để duy trì các ứng dụng AngularJS 1.x hiện có; trong phiên bản hiện đại có góc cạnh Tương đương với *ngFor Chỉ thị cấu trúc.
Ví dụ chỉ thị ng-repeat của AngularJS
Hãy cùng xem một ví dụ về chỉ thị ng-repeat trong AngularJS:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> </head> <body> <h1>Guru99 Global Event</h1> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> <div ng-app="DemoApp" ng-controller="DemoController"> <h1>Topics</h1> <ul> <li ng-repeat="tpname in TopicNames"> {{tpname.name}} </li> </ul> </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoController', function($scope) { $scope.TopicNames = [ { name: "What controllers do from Angular's perspective" }, { name: "Controller Methods" }, { name: "Building a basic controller" } ]; }); </script> </body> </html>
Code Giải thích:
- Trong tạp chí điều khiểnTrước tiên, chúng ta định nghĩa mảng các mục trong danh sách sẽ được hiển thị trong khung nhìn. Ở đây, một mảng có tên là
TopicNamesChứa ba mục, mỗi mục là một cặp tên-giá trị. - Mảng được gán trực tiếp cho
$scope.TopicNamesĐiều này giúp cho nó khả dụng đối với khung nhìn được liên kết với bộ điều khiển này. - Các thẻ HTML
<ul>(danh sách không có thứ tự) và<li>(Mục danh sách) hiển thị các mục. Chỉ thị ng-repeat lặp lại từng mục trong mảng vàtpnamelà biến cục bộ lưu trữ mục hiện tại, vì vậy{{tpname.name}}in thuộc tính tên của nó.
⚠️ Đính chính: Lời giải thích ban đầu cho biết mảng đó đã được “thêm vào một biến thành viên có tên là topics“Không có biến nào như vậy tồn tại trong mã — mảng được gán trực tiếp cho $scope.TopicNames, đó là tên mà khung nhìn đề cập đến. Việc thêm tên thứ hai ở đây là một nguyên nhân phổ biến dẫn đến danh sách trống.
Nếu đoạn mã được thực thi thành công, kết quả sau sẽ hiển thị trên trình duyệt.
Nhiều bộ điều khiển AngularJS
Trước đó, chúng ta đã thấy một bộ điều khiển duy nhất trong đó một phương thức xử lý cả phép cộng và phép trừ.tracthay vì xử lý các con số, bạn có thể sử dụng nhiều bộ điều khiển để tách biệt logic một cách rõ ràng hơn. Ví dụ, một bộ điều khiển có thể xử lý các con số trong khi bộ điều khiển khác xử lý các chuỗi ký tự.
Hãy cùng xem một ví dụ về việc định nghĩa nhiều bộ điều khiển trong một ứng dụng AngularJS.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> </head> <body> <h1>Guru99 Global Event</h1> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> <div ng-app="DemoApp"> <div ng-controller="firstcontroller"> <div ng-controller="secondcontroller"> {{lname}} </div> </div> </div> <script> var app = angular.module('DemoApp', []); app.controller('firstcontroller', function($scope) { $scope.pname = "firstcontroller"; }); app.controller('secondcontroller', function($scope) { $scope.lname = "secondcontroller"; }); </script> </body> </html>
Code Giải thích:
- Hai bộ điều khiển được định nghĩa,
firstcontrollervàsecondcontrollerMỗi phần tử gắn một biến vào chính nó. phạm vi:pnametrong trường hợp đầu tiên,lnametrong lần thứ hai - Trong giao diện, bộ điều khiển thứ hai được lồng bên trong bộ điều khiển thứ nhất, và biểu thức có dạng như sau:
lnametừ phạm vi bên trong. Bởi vì một bộ điều khiển lồng nhau kế thừa từ bộ điều khiển cha của nó,{{pname}}Điều này cũng sẽ giải quyết được vấn đề — quyền thừa kế chảy từ trên xuống dưới, chứ không bao giờ chảy từ dưới lên trên.
Nếu đoạn mã được thực thi thành công, văn bản sẽ được hiển thị. bộ điều khiển thứ hai được hiển thị.
Cách Sử dụng track bằng ng-repeat
Lỗi thường gặp nhất khi sử dụng ng-repeat là lỗi sau: Duplicates in a repeater are not allowedLỗi này xuất hiện khi một tập hợp chứa cùng một giá trị hai lần, và nó sẽ làm dừng hoàn toàn việc hiển thị danh sách.
Nguyên nhân là do danh tính. tracAngularJS cần một khóa ổn định cho mỗi mục để có thể tái sử dụng các nút DOM thay vì xây dựng lại chúng mỗi khi có mã băm. Theo mặc định, nó sử dụng chính giá trị của mục, do đó hai giá trị giống hệt nhau sẽ xung đột.
<!-- Fails: the value 2 appears twice --> <li ng-repeat="n in [1, 2, 2, 3]">{{n}}</li> <!-- Works: position is unique even when values repeat --> <li ng-repeat="n in [1, 2, 2, 3] track by $index">{{n}}</li> <!-- Best for records from a server: track by a real identifier --> <li ng-repeat="topic in TopicNames track by topic.id">{{topic.name}}</li>
Việc lựa chọn giữa hai hình thức này quan trọng hơn vẻ bề ngoài ban đầu. Tracking by $index Việc này luôn giải quyết lỗi vì vị trí là duy nhất theo định nghĩa, nhưng nó lại liên kết mỗi nút DOM với một slot thay vì với một bản ghi. Việc sắp xếp lại hoặc lọc tập hợp sau đó sẽ sử dụng lại các nút sai, điều này thể hiện ở việc các trường nhập liệu vẫn giữ nguyên.ping Văn bản của hàng trước đó.
Tracking bằng một mã định danh chính xác như topic.id Nó hoàn toàn tránh được điều đó. AngularJS có thể theo dõi từng bản ghi khi nó di chuyển, vì vậy nó sắp xếp lại các nút hiện có thay vì phá hủy và xây dựng lại chúng. Trên các danh sách dài, điều này cũng nhanh hơn đáng kể, vì việc hiển thị lại chỉ tác động đến các hàng thực sự đã thay đổi. Sử dụng $index Chỉ áp dụng cho mảng các giá trị thông thường không bao giờ được sắp xếp lại.
Các tính năng đặc biệt có sẵn bên trong ng-repeat
Mỗi lần lặp của ng-repeat đều hiển thị một số thuộc tính chỉ đọc trên phạm vi con của chính nó. Chúng mô tả vị trí của mục hiện tại trong tập hợp, bao gồm đánh số, kiểu xen kẽ và dấu phân cách mà không cần thêm bất kỳ trạng thái nào vào bộ điều khiển.
| Bất động sản | Kiểu | Giá trị |
|---|---|---|
$index |
Con số | Vị trí của mục hiện tại, bắt đầu từ 0. |
$first |
Boolean | Chỉ đúng với mục đầu tiên. |
$last |
Boolean | Chỉ đúng với mục cuối cùng. |
$middle |
Boolean | Điều này đúng với mọi mục không phải là mục đầu tiên cũng không phải là mục cuối cùng. |
$even |
Boolean | Đúng khi $index là số chẵn |
$odd |
Boolean | Đúng khi $index là số lẻ |
Một cách sử dụng điển hình là kết hợp chúng với ng-class để tạo sọc vằn.ping, như trong ng-class="{'row-alt': $odd}"hoặc sử dụng ng-if để tạo dấu phân cách trên mỗi hàng ngoại trừ hàng cuối cùng, được viết như sau: ng-if="!$last"Việc hiển thị số hàng dễ đọc đối với con người chỉ đơn giản là... {{$index + 1}}Vì chỉ số bắt đầu từ 0, nên tất cả sáu thuộc tính đều được tính toán lại tự động mỗi khi tập hợp thay đổi, do đó không cần phải tính toán lại bằng tay.
Các lỗi thường gặp khi sử dụng ng-repeat và cách khắc phục chúng.
Hầu hết các sự cố với ng-repeat đều xuất phát từ các giá trị trùng lặp, từ việc kế thừa phạm vi hoặc từ việc chỉ thị nằm trên phần tử không phù hợp. Mỗi triệu chứng dưới đây đều nêu rõ nguyên nhân của nó.
- Không được phép có các bản ghi trùng lặp trong bộ lặp: Bộ sưu tập chứa một giá trị lặp lại. Thêm
track by $index, hoặc tốt hơn,track bymột bất động sản độc đáo. - Danh sách này không hiển thị gì cả: Tên trong view không khớp với thuộc tính trên scope. In bộ sưu tập với
{{TopicNames}}để xác nhận nó đã đến nơi. - Mọi thành phần đều lặp lại, kể cả phần bao bọc: Thuộc tính ng-repeat được đặt trên vùng chứa thay vì trên phần tử. Hãy di chuyển nó đến đúng vị trí.
<li>or<tr>. - Chỉnh sửa dữ liệu nhập vào sẽ thay đổi nhầm hàng: danh sách là tracđược thực hiện bởi
$indextrong khi các mặt hàng được sắp xếp lại. Track được thay thế bằng một mã định danh ổn định. - Các thay đổi bên trong vòng lặp không được lưu lại: Mỗi lần lặp có phạm vi con riêng, vì vậy việc ghi vào một kiểu dữ liệu nguyên thủy sẽ tạo ra một bản sao cục bộ. Hãy ghi vào thuộc tính của đối tượng, chẳng hạn như...
item.done.




