2012-01-25 106 views
7

我想用Knockout構建一些HTML,Jquery UI可以變成toggle buttons。我需要得到的是這樣的:在Knockout Foreach循環中生成ID

<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> 

使用JQuery UI我可以很容易地把它變成切換按鈕。但是,如何在不使用現在折舊的JQuery模板的情況下生成該文件?這就是我試圖做:

的JavaScript模型中:

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

的標記:

<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> 

這是行不通的。我不認爲它喜歡我如何創建該ID,或者將它與循環中的for關聯起來。它錯誤地繪製按鈕,因爲兩個獨立的按鈕和點擊功能不起作用。

即使我只是指定的值,如:id: Valuefor: Value它仍然不起作用。我可以不使用knockout來設置這些屬性嗎?

+0

貌似還沒有一個針對屬性「ID」或結合「的。」我需要爲它編寫一個自定義綁定。 http://knockoutjs.com/documentation/custom-bindings.html – Arbiter

回答

10

添加此javascript解決了我的問題:

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()); 
    } 
}; 

我也不得不改變for: 'status_' + Valueforatt: 'status_' + Valuefor是一個保留字。

更新: 我可能也有使用「ATTR」結合,就像這樣:

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

你也可以使用data-bind =「attr:{for:'status_'+ $ index}」和data-bind =「attr:{id:' status_'+ $ index}「爲唯一ID。 $ index引用當前數組項目的從零開始的索引。 $ index是一個可觀察值,只要項目的索引發生更改(例如,如果將項目添加到陣列或從陣列中刪除項目),它就會更新。 – viperguynaz

+0

AFAIK處理保留關鍵字問題與更改爲:''到'for'一樣簡單:'' –

+3

您在'**更新**'中添加的解決方案是解決此問題的正確方法。添加一個額外的綁定處理程序似乎不值得麻煩。 – Tyblitz