Cú pháp ràng buộc không chứa KnockoutJS
Vui lòng thông báo cho tôi một chút: KnockoutJS cung cấp một tùy chọn cực kỳ thuận tiện là sử dụng cú pháp liên kết không chứa cho foreach
liên kết của nó như đã thảo luận trong Chú thích 4 của foreach
tài liệu ràng buộc.
http://knockoutjs.com/documentation/foreach-binding.html
Như ví dụ tài liệu Knockout minh họa, bạn có thể viết ràng buộc của mình trong KnockoutJS như sau:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
Tôi nghĩ rằng khá đáng tiếc là AngularJS không cung cấp loại cú pháp này.
Angular's ng-repeat-start
vàng-repeat-end
Trong cách AngularJS để giải quyết ng-repeat
vấn đề, các mẫu tôi bắt gặp thuộc loại jmagnusson được đăng trong câu trả lời (hữu ích) của anh ấy.
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
Suy nghĩ ban đầu của tôi khi nhìn thấy cú pháp này là: thực sự? Tại sao Angular buộc tất cả các đánh dấu bổ sung này mà tôi không muốn làm gì cả và điều đó dễ dàng hơn nhiều trong Knockout? Nhưng sau đó nhận xét của hitautodestruct trong câu trả lời của jmagnusson bắt đầu khiến tôi tự hỏi: điều gì đang được tạo với ng-repeat-start và ng-repeat-end trên các thẻ riêng biệt?
Một cách tốt hơn để sử dụng ng-repeat-start
vàng-repeat-end
Khi điều tra về khẳng định của hitautodestruct, việc thêm ng-repeat-end
vào một thẻ riêng biệt là chính xác những gì tôi không muốn làm trong hầu hết các trường hợp, bởi vì nó tạo ra các phần tử hoàn toàn vô dụng: trong trường hợp này, <li>
các mục không có gì trong đó. Danh sách phân trang của Bootstrap 3 tạo kiểu cho các mục trong danh sách để có vẻ như bạn không tạo ra bất kỳ mục thừa nào, nhưng khi bạn kiểm tra html được tạo, chúng ở đó.
May mắn thay , bạn không cần phải làm gì nhiều để có một giải pháp sạch hơn và số lượng html ngắn hơn: chỉ cần đặt ng-repeat-end
khai báo trên cùng một thẻ html cóng-repeat-start
.
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat-start="page in [1,2,3,4,5]" ng-repeat-end><a href="#"></a></li>
<li>
<a href="#">»</a>
</li>
</ul>
Điều này mang lại 3 lợi thế:
- ít thẻ html để viết
- các thẻ trống, vô dụng không được tạo bởi Angular
- khi mảng cần lặp lại trống, thẻ với
ng-repeat
sẽ không được tạo, mang lại cho bạn lợi thế tương tự như ràng buộc không chứa của Knockout mang lại cho bạn về mặt này
Nhưng vẫn có một cách sạch hơn
Sau khi xem xét thêm các nhận xét trong github về vấn đề này cho Angular, https://github.com/angular/angular.js/issues/1891 ,
bạn không cần sử dụng ng-repeat-start
và ng-repeat-end
đạt được những lợi ích tương tự. Thay vào đó, làm lại ví dụ của jmagnusson, chúng ta chỉ có thể đi:
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat="page in [1,2,3,4,5,6]"><a href="#">{{page}}</a></li>
<li>
<a href="#">»</a>
</li>
</ul>
Vậy sử dụng khi nào ng-repeat-start
và ng-repeat-end
? Theo tài liệu góc , để
... lặp lại một loạt các phần tử thay vì chỉ một phần tử mẹ ...
Nói đủ rồi, chỉ ra một số ví dụ!
Đủ công bằng; jsbin này sẽ trình bày qua năm ví dụ về những gì sẽ xảy ra khi bạn làm và khi bạn không sử dụng ng-repeat-end
trên cùng một thẻ.