0

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

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

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

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

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

我的表中有这个代码片段:

<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。为什么这不起作用?

4

4 回答 4

0

我用一个检查绑定的例子创建了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
于 2013-08-05T20:19:40.290 回答
0

nonzero numbers and non-null objects and non-empty strings will all be interpreted as true

In your case both "1" and "0" are non-empty strings, that cast to true.
Your code would work if you had the numeric value of tax ("tax": 1 or "tax": 0)

于 2013-08-05T20:14:31.193 回答
0

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 中使用布尔值或整数,这将起作用。

于 2013-08-05T20:21:47.507 回答
0

尝试这个

<td><input type="checkbox" data-bind="checked: (tax==0||!tax)?false:true" /></td>
于 2013-08-05T21:23:07.810 回答