【问题标题】:knockoutjs radio integer databind for check not working用于检查的 knockoutjs 无线电整数数据绑定不起作用
【发布时间】:2017-10-18 01:51:45
【问题描述】:

检查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"/>

函数无线电数据(文本,值){ this.text = 文本; this.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
};

有什么好的解释吗?

【问题讨论】:

    标签: knockout.js data-binding


    【解决方案1】:

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

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

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

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

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

    一个例子是:

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

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

    【讨论】:

    • 你是如何用checkedValue绑定解决的,你能编辑jsfiddle吗?
    • 我已经更新了你的小提琴以使用checkedValue,你可以在jsfiddle.net/p6fny/25看到。在此版本中,版本按钮(将值设置为 int 而不是字符串的按钮有效,而其他按钮则无效)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多