knockoutjs radio integer databind for check not working

时间:2014-02-14 11:19:23

标签: knockout.js data-binding

检查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
};

任何好的解释?

1 个答案:

答案 0 :(得分:11)

如果希望checkedValue绑定使用除元素的值字符串之外的其他内容进行选择,则还需要使用checked绑定。来自the knockout documentation on the checked binding

  

如果绑定还包含checkedValue,则定义checked对象使用的值而不是element的value属性。如果您希望值不是字符串(例如整数或对象),或者您希望动态设置值,那么这非常有用。

如果您查看文档,您还会看到一个示例,他们将当前$data对象用作checkedValue

编辑:添加解释为什么将值转换为字符串有助于解决问题。

如果将整数转换为字符串,选择工作正常的原因是,检查的绑定在不允许类型转换的情况下进行相等性比较,即使用===而不是==进行相等性比较。

这方面的一个例子是:

1 == "1" // true
1 === "1" // false

在上面示例的第一行中,JavaScript在执行比较时进行类型转换(这使得比较运算符两侧的操作数都是相同的类型),而在后者中则不是。