2012-01-29 61 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