2012-01-29 63 views
1

的「選中」結合工作不是由一個foreach控制流產生的無線電按鈕非常相容。淘汰賽JS與在foreach控制流和radion作爲模板

例如:

<div data-bind="foreach: targetAudience"> 
     <div> 
      <label> 
       <input name="targetAudience" type="radio" data-bind="checked: isSelected,value:id" /> 
       <span data-bind="text: name"></span> 
      </label> 
     </div> 
    </div> 

每個VM(單個目標)將獲得所選擇的無線電的id在IsSelected屬性。 這看起來有點臭,有沒有更好的方法知道誰是選定的收音機?

+0

你要什麼'isSelected'設置爲?此外,您不希望使用'attr:{value:id}'而不是'value'綁定,因爲您不希望附加多個事件處理程序。 – 2012-01-29 21:31:04

+0

我希望isSelected在未選中的所有廣播中都是false,在選中的廣播中爲true。 – 2012-01-30 08:44:14

+0

請解釋你的評論,我想我錯過了什麼,你是什麼人多個事件處理程序。 – 2012-01-30 08:45:04

回答

3

的「選中」與單選按鈕工作時被設計來用的各個單選按鈕的「價值」的模式,而不是陣列中的更新在每個項目上的標記結合。

一個簡單的方法來完成這項工作,雖然是有它填充父設備上的值,然後添加一個計算觀察到,在每個項目,以確定其選定的標誌是否是真或假。

這裏有一個例子:

var Item = function(id, name, selected) { 
    this.id = id; 
    this.name = ko.observable(name); 
    this.selected = ko.computed(function() { 
     return parseInt(selected(), 10) == this.id; 
    }, this); 
}; 

var ViewModel = function() { 
    this.selected = ko.observable(2); 
    this.items = ko.observableArray([ 
     new Item(1, "one", this.selected), 
     new Item(2, "two", this.selected), 
     new Item(3, "three", this.selected) 
     ]); 
}; 

然後,綁定,如:

<ul data-bind="foreach: items"> 
    <li> 
     <input type="radio" name="items" data-bind="attr: { value: id }, checked: $root.selected" /> 
     <span data-bind="text: name"></span> 
    </li> 
</ul> 

http://jsfiddle.net/rniemeyer/zNkhR/

+0

在計算方法中,如何做KO/js知道parseInt中的selected()屬於視圖模型? – 2012-01-31 08:34:47

+0

在這種情況下,'selected'被傳遞到構造函數的一個項目,並提供給經由所述封閉的計算觀察到的功能。 – 2012-02-01 03:25:42

+0

喔,沒有注意到的是,坦克 – 2012-02-01 14:30:37