我是编程的新手,尤其是淘汰赛。我有一个正在填充foreach绑定的表。在这个表中,我有一个列,我想成为一个复选框,其检查值是从通过ajax检索的mysql数据库值填充的。我知道检查过的绑定应该能够取0或1并松散地转换为选中和取消选中。
http://knockoutjs.com/documentation/checked-binding.html
对于复选框,KO将设置要检查的元素 参数值为true,如果为false则取消选中。如果你给 一个实际上不是布尔值的值,它将被松散地解释。 这意味着非零数字和非空对象非空 字符串将全部解释为true,而零,null, undefined,空字符串将被解释为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,总是会检查复选框。为什么这不起作用?
答案 0 :(得分:0)
非零数字和非空对象以及非空字符串都将是 解释为真
在您的情况下,"1"
和"0"
都是非空字符串,会转换为true
。
如果您的数字值为tax
("tax": 1
或"tax": 0
)
答案 1 :(得分: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
答案 2 :(得分:0)
Javascript有一种处理true / false的特殊方式:语句可以是“truthy”或“falsy”。 例如,“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中使用布尔值或整数,这将起作用。
答案 3 :(得分:0)
试试这个
<td><input type="checkbox" data-bind="checked: (tax==0||!tax)?false:true" /></td>