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 foreachliên kết của nó như đã thảo luận trong Chú thích 4 của foreachtà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-startvàng-repeat-end
Trong cách AngularJS để giải quyết ng-repeatvấ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-startvàng-repeat-end
Khi điều tra về khẳng định của hitautodestruct, việc thêm ng-repeat-endvà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-endkhai 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-repeatsẽ 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-startvà 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-startvà 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-endtrên cùng một thẻ.