2012-01-15 26 views
18

Làm cách nào để kiểm soát việc bỏ qua các yếu tố nhất định bằng cách so sánh?Knockout.js foreach: nhưng chỉ khi so sánh là đúng

Những gì tôi muốn ví dụ là một cái gì đó như thế này:

<div data-bind="foreach: entry where (entry.number > 10)"> 

Vì vậy, những gì tôi muốn nó phải làm là lặp qua entry 's nhưng chỉ thực hiện khi mà hiện tại entry có một giá trị number hơn 10 .

Điều này có thể thực hiện được không?

Trả lời

23

Hiện tại điều đó không thể xảy ra với knockout.js, nhưng đây là một tính năng thú vị. Bạn nên gửi báo cáo lỗi/liên hệ với tác giả để xem xét nó cho một phiên bản trong tương lai.

Cách 1:

<div data-bind="foreach: entry"> 
    <div data-bind="if: entry.number > 10"></div> 
</div> 

Way 2:
Viết một phương pháp lọc tùy chỉnh cung cấp cho bạn một loạt các yếu tố phù hợp với điều kiện của bạn và sử dụng nó trong foreach của bạn.

+0

Tôi đã theo ** Cách 1 **, trước câu trả lời của bạn, thay thế - tôi sẽ gắn bó với nó. Cảm ơn! – LouwHopley

+0

Không có vấn đề gì, tôi biết rằng đó là cách thông thường, nhưng bao gồm nó: D –

17

thử điều này:

<div data-bind="foreach: editingItem.columns"> 
     <!-- ko if: Selected--> 
     <div data-bind="text: Name"></div> 
      <input type="text"/> 
      <!-- /ko --> 
+0

Xin chào @JustMe, câu trả lời hay nhất tôi đã không phát hiện lúc đầu, cho đến khi tôi vài nghiên cứu. Điều quan trọng cần lưu ý là nếu ràng buộc có thể hoạt động bên trong một chú thích. http://knockoutjs.com/documentation/if-binding.html Cũng có thể là một ý tưởng hay để sửa đổi câu trả lời của bạn để nó áp dụng cụ thể cho câu hỏi, ví dụ: sử dụng "entry.number" theo cách đó làm cho nó dễ dàng hơn để xem nó như thế nào áp dụng để giải quyết vấn đề. –

+0

Cảm ơn @AlexKey Tôi mới vào KnockoutJS và tôi đã đi máng các hướng dẫn và chúng rất hữu ích. – JustMe

+0

Hoàn hảo để lọc các hàng trong bảng. – Rake36

4

gì về

<div data-bind="foreach: _.filter(entry(), function(item) { return item.number > 10;})"> 

sử dụng underscore.js

+0

Đẹp! Gạch dưới là da-bom – skrile

6

Tôi nghĩ rằng nó sẽ là tốt hơn để sử dụng được xây dựng trong phương pháp arrayFilter (xem http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html)

viewModel.filteredEntries = ko.computed(function() { 

    return ko.utils.arrayFilter(this.entries(), function(item) { 
     return item.number > 10; 
    }); 

}, viewModel); 

Sau đó, bạn có thể chỉ cần databind đến các FilterEntries như bình thường

Các vấn đề liên quan