2012-07-02 26 views
14

Tại sao khi tôi cố gắng sử dụng knockout.js để ràng buộc một số văn bản bằng cách sử dụng $ index, tôi nhận được mã của một hàm thay vì một số?

<tbody data-bind="foreach: MyList"> 
    <tr> 
    <td><span data-bind="text: $index + 1"></span></td> 
    </tr> 
</tbody> 

Thay vì nhận được 1, 2, 3 vv, tôi có được điều này:

enter image description here

Bạn có thể nhìn thấy, bởi ký tự cuối cùng trong hình trên, chỉ số của tôi về zero là được thêm vào 1. Nếu tôi xóa '+ 1' khỏi liên kết của mình, tôi nhận được 0, 1, 2 thay vì hàm.

Tôi làm cách nào để yêu cầu loại trực tiếp đánh giá biểu thức? Tôi có cùng một vấn đề khi tôi gửi biểu mẫu. Các trường chuỗi của tôi đang được gửi dưới dạng hàm thay vì giá trị.

Trả lời

31

$ chỉ số là một quan sát, là một hàm. Hãy thử <span data-bind="text: $index() + 1"></span>

+0

Điều đó đã khắc phục. Tại sao tài liệu không có các ví dụ với parens? http://knockoutjs.com/documentation/binding-context.html – rboarman

+1

Đây là vấn đề chung khi sử dụng các quan sát trong biểu thức. Nếu bạn đang sử dụng bản thân quan sát được, các ràng buộc sẽ chấp nhận một mình, nhưng khi bạn bắt đầu bao gồm các quan sát trong các biểu thức, bạn phải sử dụng biểu mẫu() để truy cập giá trị thực. Xem http://knockoutjs.com/documentation/observables.html để 'Đọc và viết các quan sát'. –

+0

Cảm ơn sự giúp đỡ! – rboarman

4

Nếu bạn sử dụng

<span data-bind="text: $index() + 1"></span> 

và ví dụ giá trị chỉ số của bạn là 2, các văn bản của nhịp của bạn sẽ là: 21 và không 3.

bạn nên xác định một hàm trong ViewModel của bạn , như thế này:

self.itemNumber = function(index) { 
    return index + 1; 
} 

và sau đó trong khoảng thời gian của bạn, bạn nên làm:

<span data-bind="text: $root.itemNumber($index())"></span> 

Tôi hy vọng điều này sẽ giúp :)

+0

+1 cho thực tế đơn giản là nếu chỉ mục là 2, thì bằng cách sử dụng kỹ thuật trả lời được chấp nhận, bạn nhận được 21, 23 hoặc hơn thay vì 3, 4 ecc. Tôi không hiểu làm thế nào chấp nhận câu trả lời chấp nhận, nó chỉ là sai (ít nhất là với loại trực tiếp 2.2.1). – firepol

+0

Đây là một jsFiddle ... nó có vẻ làm việc với cả hai phương pháp: S http://jsfiddle.net/BAEsx/24/ – Donatella

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