检查JSFiddle
<div data-bind="foreach: ids" class="">
<label>
<input type="radio" name="someid" data-bind="value: value, checked: $root.selectedid" />
<span data-bind="text: text"></span>
</label>
</div>
<br/>
<input type="button" data-bind="click: test1" value="Test1"/>
<input type="button" data-bind="click: test2" value="Test2"/>
<input type="button" data-bind="click: test3" value="Test3"/>
function radiodata(text,value){ this.text = text; this.value = value; }
var viewModel = function(){
var self = this;
self.selectedid = ko.observable();
self.ids = ko.observableArray([
new radiodata('one',1),
new radiodata('two',2),
new radiodata('three',3)
]);
self.test1 = function(){
self.selectedid(2);//this doesnot work
};
self.test2 = function(){
self.selectedid('2');//this works
};
self.test3 = function(){
self.selectedid((3).toString());//this was my hack
};
}
var model = new viewModel();
ko.applyBindings(model);
我正在尝试radio databind
checked
财产,
selectedid
的json数据是整数,我试图将checked
绑定到无线电。
我也为此修补了解决方案,但是有人知道为什么整数数据绑定不起作用吗?
之类的地方,self.testX
函数会更改广播checked
属性
self.test1 = function(){
self.selectedid(2); //this doesnot work
};
self.test2 = function(){
self.selectedid('2');//this works
};
self.test3 = function(){
self.selectedid((3).toString()); //and this was my hack
};
任何好的解释?
答案 0 :(得分:11)
如果希望checkedValue
绑定使用除元素的值字符串之外的其他内容进行选择,则还需要使用checked
绑定。来自the knockout documentation on the checked binding:
如果绑定还包含checkedValue,则定义checked对象使用的值而不是element的value属性。如果您希望值不是字符串(例如整数或对象),或者您希望动态设置值,那么这非常有用。
如果您查看文档,您还会看到一个示例,他们将当前$data
对象用作checkedValue
。
编辑:添加解释为什么将值转换为字符串有助于解决问题。
如果将整数转换为字符串,选择工作正常的原因是,检查的绑定在不允许类型转换的情况下进行相等性比较,即使用===
而不是==
进行相等性比较。
这方面的一个例子是:
1 == "1" // true
1 === "1" // false
在上面示例的第一行中,JavaScript在执行比较时进行类型转换(这使得比较运算符两侧的操作数都是相同的类型),而在后者中则不是。