【问题标题】:Knockout Check Box binding to ajax retrieved value敲除复选框绑定到 ajax 检索值
【发布时间】:2013-08-05 20:06:51
【问题描述】:

我是一般的编程新手,但尤其是淘汰赛。我有一个使用 foreach 绑定填充的表。在这个表中,我有一列我想成为一个复选框,它的选中值是从通过 ajax 检索的 mysql 数据库值填充的。我知道选中的绑定应该能够取 0 或 1 并松散地转换为选中和未选中。

http://knockoutjs.com/documentation/checked-binding.html

对于复选框,KO 将设置要检查的元素,当 参数值为真,为假时不勾选。如果你给 一个实际上不是布尔值的值,它将被松散地解释。 这意味着非零数和非空对象和非空 字符串都将被解释为真,而零、空、 未定义,空字符串将被解释为假。

假设这是我的 ko.observableArray 命名部分:

{"id":"1","partdes":"asdf","partcost":"1.00","sellcost":"2.00","tax":"1"}

我的桌子上有这个代码 sn-p:

<tbody data-bind="foreach: parts">
    <tr>
        <td data-bind="text: id"></td>
        <td data-bind="text: partdes"></td>
        <td data-bind="text: partcost"></td>
        <td data-bind="text: sellcost"></td>
        <td><input type="checkbox" data-bind="checked: tax" /></td>

          //And I added this line to get the actual value: 
        <td data-bind="text: tax"></td>
    </tr>
</tbody>

一切正常,除了复选框总是被选中,即使值为 0。为什么这不起作用?

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    非零数字和非空对象和非空字符串都将是 解释为真

    在您的情况下,"1""0" 都是非空字符串,它们都转换为 true
    如果您的数值为 tax"tax": 1"tax": 0),您的代码将起作用

    【讨论】:

    • 我相信你在这里是正确的,因为我已经读过 ajax 将布尔值作为字符串传递。一旦值通过,关于如何转换回布尔值的任何建议?
    • > 我读过 ajax 将布尔值作为字符串传递。这是不正确的。您可以传递布尔值、数字或字符串。我建议检查后端代码。如果您无法控制后端,您可以在前端接收到数据后进行处理。类似于:`data.parts.forEach(function (d) { d.tax = (d.tax === '0' ? false : true); });
    • 不幸的是,我确实可以控制后端,这就是问题所在。在做了一些研究之后,我能够在我的 ajax 调用的后端使用 $success=settype($tax, "boolean"); 将我的变量转换为 PHP 中的布尔值。这将 $tax 转换为布尔值并作为 true / false 传递,允许我在本地使用调用,而不必更改前端的任何代码。
    【解决方案2】:

    我创建了jsfiddle 并带有一个检查绑定的示例。

    self.parts.push(new part({id: 1, tax: 0}));    -- set as non checked
    self.parts.push(new part({id: 2, tax: 1}));    -- set as checked
    self.parts.push(new part({id: 3, tax: true})); -- set as checked
    

    【讨论】:

    • 是的,我看到您的示例有效,我可能应该创建这种类型的映射,并且可能必须这样做。到目前为止,我正在使用 ko.mapping.fromJS(data, {}, ViewModel.parts) 所以这个映射会自动被传递。我不知道如何将该值强制为布尔值或整数。
    • 我相信随着我对淘汰赛的了解更多,这可能是更好的解决方案。我选择了 amakhrov 的答案,因为我不必更改任何代码来实现它。我会研究你的小提琴。
    【解决方案3】:

    Javascript 有一种处理真/假的特殊方式:一个陈述可以是“真”或“假”。 例如“0”是“真实的”,但它不是真实的。 javascript中有两种比较运算符。如果要测试是否相等,可以使用“==”或“===”(或“!=”和“!==”表示不相等)。最后一个意味着严格的平等。您可以使用以下代码对其进行测试:

    var test = "1";
    if(test) {
        alert("truthy");
    }
    if(test == true) {
        alert("truthy");
    }
    if(test === true) {
        alert("but not true!");
    }
    

    将显示前两个警报。最后一个不会。字符串为真(既未定义也不为空),但不严格等于真。

    在您的情况下,Knockout 测试“正常”平等(真实)。这意味着“0”或“1”字符串都是真实的。如果你的变量是纯整数,0 是假的,严格等于假,1 是真,等于真。

    因此,您必须在 JSON 中使用布尔值或整数,这样就可以了。

    【讨论】:

      【解决方案4】:

      试试这个

      <td><input type="checkbox" data-bind="checked: (tax==0||!tax)?false:true" /></td>
      

      【讨论】:

      • 我试过了,但它对我不起作用。我认为根据其他答案,我需要它是一个整数而不是一个字符串才能工作。我确实在 ajax 调用的后端修改了我的 php,以返回 true 或 false(当然是在字符串中)。可以修改它以反映字符串值而不是整数吗?请原谅我的愚蠢问题,但我真的不知道你在这里做什么。
      猜你喜欢
      • 2014-09-22
      • 2015-04-12
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多