2013-04-18 27 views
9

Câu hỏi gốcKnockout 'for' binding?

Có ai có hoặc biết một ràng buộc cho loại trực tiếp mà sẽ cho phép hành vi tương tự như một vòng lặp for? Tôi có thể kiếm tiền để làm điều tôi muốn nhưng sẽ tốt hơn nếu tôi không phải làm theo cách đó.

Chỉnh sửa 2

Tôi cố gắng để tạo ra các hàng bảng dựa trên sự lựa chọn của người dùng thực hiện. Trong một số trường hợp, tôi cần x hàng, trong đó x là độ dài của một mảng, các lần khác x đại diện cho các hàng số lớn nhất cần thiết để hiển thị số n mảng.

Ví dụ: image1 được xây dựng dựa trên 4 mảng khác nhau, tất cả đều khác nhau về kích thước image2 được tạo từ cùng một mảng và được tăng gấp đôi trong trường hợp này.

enter image description here enter image description here

<div data-bind="if: selectedTab()"> 
<table> 
<thead> 
    <tr> 
    <td> 
     <div class="a-i-post-All"></div> 
    </td> 
    <!-- ko foreach:$root.selectedTab().races--> 
    <td> 
     <input type="checkbox" /> 
    </td> 
    <!-- /ko --> 
    </tr> 
</thead> 
<tbody data-bind="foreach: selectedTab().runners"> // <-- This is an empty array created by the max number of Runners in the selectedTabs array of Races 
    <tr> 
    <td> 
     <div class="a-i-post"></div> 
    </td> 
    <!-- ko foreach:$root.selectedTab().races--> 
    <td> 
     <!-- ko if: Runners.length > $parentContext.$index()--> 
     <input type="checkbox" /> 
     <!-- /ko --> 
    </td> 
    <!-- /ko --> 
    </tr> 
</tbody> 

Trên đây hoạt động tốt và tạo ra những gì tôi muốn, nhưng tôi không thích phải quay selectedTab.runners từ một số thành một mảng trống chỉ để làm cho nó vòng lặp n lần để tạo các hàng. Tôi mở cho các đề xuất. Lưu ý Tính đến thời điểm tôi đăng câu hỏi này ban đầu, tôi đã sửa đổi mã này đáng kể và bây giờ chỉ còn một lần xuất hiện liên quan đến câu hỏi ban đầu của tôi.

+0

Tại sao bạn không muốn sử dụng foreach với $ index? –

+0

Tôi muốn có thể tìm kiếm trên một số thay vì một mảng – Zholen

+2

Điều này không thực sự là những gì Knockout dành cho. Tôi đang cố gắng nghĩ về một ví dụ thế giới thực, nơi bạn sẽ cần phải lặp lại điều gì đó đã xác định 'x' số lần trong JavaScript, nơi nó không thể đơn giản được thực hiện phía máy chủ khi chế độ xem được tạo lần đầu tiên. Tôi đang thua lỗ. Có lẽ, nếu bạn thực sự nói với chúng tôi những gì bạn đang thực sự cố gắng làm, ai đó có thể cho bạn thấy một cách tốt hơn. –

Trả lời

12

My Repeat ràng buộc thực hiện chính xác điều này.

<tbody> 
    <tr data-bind="repeat: { foreach: selectedTab().runners, index: '$runner' }"> 
    <td> 
     <div class="a-i-post"></div> 
    </td> 
    <td data-bind="repeat: selectedTab().races"> 
     <!-- ko if: $item().Runners.length > $runner --> 
     <input type="checkbox" /> 
     <!-- /ko --> 
    </td> 
    </tr> 
</tbody> 
+0

Cảm ơn bạn đã giải quyết câu hỏi ban đầu của mình. Điều này dường như làm những gì tôi muốn nhưng tại thời điểm này tôi đã tái yếu tố mã của tôi và có thể không cần phải xử lý các hành động như vậy nữa, ít hơn tôi sử dụng nó vì lý do hiệu suất. – Zholen

+0

Điều đó trông rất thú vị Michael! –

3

Bạn có thể làm một cái gì đó như thế này:

<div data-bind="foreach: [0,0,0,0,0]"> 
    <span data-bind="text: $index"></span> 
</div> 

Và bạn sẽ nhận được các yếu tố 0-4.

Nhưng, như Chris đã nói trong phần nhận xét, điều này có vẻ lạ. Hãy cho chúng tôi biết bạn đang cố gắng làm gì và chúng tôi sẽ chỉ cho bạn đúng hướng.

4

Bạn có thể tạo một đối tượng Array:

<!-- ko foreach: new Array(the_length_you_need) --> 
     <span>&#9733;</span> 
    <!-- /ko --> 

này sẽ in một ngôi sao cho the_length_you_need lần