2012-01-25 42 views
7

Tôi đang cố gắng xây dựng một số HTML với Knockout rằng giao diện người dùng Jquery có thể biến thành toggle buttons. Những gì tôi cần đến là:Tạo ID trong vòng Knockout Foreach vòng

<div id="status"> 
    <input type="radio" id="status_ACTIVE" value="ACTIVE" name="status" /><label for="status_ACTIVE">Active</label> 
    <input type="radio" id="status_INACTIVE" value="INACTIVE" name="status" checked="checked" /><label for="status_INACTIVE">Inactive</label> 
</div> 

Sử dụng giao diện người dùng JQuery Tôi có thể dễ dàng biến thành nút chuyển đổi. Nhưng làm thế nào để tôi tạo ra điều đó mà không cần sử dụng các mẫu JQuery đã mất giá hiện nay? Đây là những gì tôi đã cố gắng để làm:

Bên trong mô hình javascript:

self.statuses = [{Selected:true,Text:"Active",Value:"ACTIVE"},{Selected:false,Text:"Inactive",Value:"INACTIVE"}]; 

Các đánh dấu:

<div id="status" data-bind="foreach: statuses"> 
    <input type="radio" name="status" data-bind="value: Value, id: 'status_' + Value" /><label data-bind="text: Text, for: 'status_' + Value"></label> 
</div> 

này không hoạt động. Tôi không nghĩ rằng nó thích cách tôi đang cố tạo ID đó, hoặc liên kết nó với vòng lặp for. Nó vẽ các nút không chính xác, vì hai nút độc lập và chức năng nhấp chuột không hoạt động.

Thậm chí nếu tôi chỉ chỉ định giá trị làm id như: id: Valuefor: Value nó vẫn không hoạt động. Tôi có thể không đặt các thuộc tính này bằng cách loại trực tiếp không?

+0

Hình như không có một ràng buộc cho các thuộc tính "id" hoặc "cho." Tôi cần phải viết một ràng buộc tùy chỉnh cho nó. http://knockoutjs.com/documentation/custom-bindings.html – Arbiter

Trả lời

10

Thêm javascript này giải quyết vấn đề của tôi:

ko.bindingHandlers.id = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     $(element).attr('id', valueAccessor()); 
    } 
}; 

ko.bindingHandlers.forattr = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     $(element).attr('for', valueAccessor()); 
    } 
}; 

tôi đã phải thay đổi for: 'status_' + Value vào foratt: 'status_' + Value như for là một từ dành riêng.

Cập nhật: tôi có thể cũng đã sử dụng "attr" ràng buộc, như thế này:

attr: { for: 'status_' + Value } 
+2

Bạn cũng có thể sử dụng data-bind = "attr: {for: 'status_' + $ index}" và data-bind = "attr: {id: ' status_ '+ $ index} "cho các ID duy nhất. $ index để chỉ đến chỉ mục dựa trên số không của mục mảng hiện tại. Chỉ mục $ là một quan sát và được cập nhật bất cứ khi nào chỉ mục của mục thay đổi (ví dụ: nếu các mục được thêm vào hoặc bị xóa khỏi mảng). – viperguynaz

+0

AFAIK đối phó với vấn đề từ khóa được dành riêng dễ dàng như thay đổi cho: '' thành 'cho': '' –

+3

Giải pháp bạn thêm vào trong '** cập nhật **' là cách phù hợp để giải quyết vấn đề này. Việc thêm một trình xử lý ràng buộc bổ sung dường như không đáng giá. – Tyblitz

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