我正尝试使用Knockout.js创建复选框的列表。该列表本身来自数据绑定源,以及列表中的哪些项目被选中。我有这个模型看起来是这样的:使用Knockout.js创建数据绑定复选框时未选中任何内容
var ViewModel = function()
{
this.areas = [{AreaId: 1, Name: 'Test 1'}, {AreaId: 2, Name: 'Test 2'}, {AreaId: 3, Name: 'Test 3'}];
this.AreasImpacted = ko.observableArray([1, 2]);
};
现在,我想创建的复选框列表与标签测试1,测试2和测试3。我想要测试1和测试2检查。我的HTML看起来像这样:
<span class="areas" data-bind="foreach: areas">
<label><input type="checkbox" data-bind="value: AreaId, checked: $parent.AreasImpacted" /><span data-bind="text: Name"></span></label>
</span>
这不绘制每个复选框用正确的名字,我可以验证每个复选框的value
属性被设置正确,但是没有得到确认!我也尝试将this.AreasImpacted
设置为2
。当我这样做时,所有3个复选框都会被检查!
完全困惑!
更新:
如果我改变模式:
this.AreasImpacted = ko.observableArray(['1', '2']);
然后,事情按预期工作。
如果我不得不猜测,我会说for-each
绑定正在将每个值转换为一个字符串。我很好奇,如果这是设计,或Knockout.js错误。我期望输入的值是数字,因为这是我所约束的。提起
错误:
由于上述代码并不如documented工作,我已经提交GitHub上一个bug。
从[Knockout Docs](http://knockoutjs.com/documentation/checked-binding.html):*如果您的参数解析为数组,则会给予特别的考虑。在这种情况下,如果值匹配数组中的项,KO将设置要检查的元素,如果数组不包含,则取消选中。* - 含义,因为'AreasImpacted'是一个数组,所以应该检查if该项目存在于数组中。为什么它不像记录的那样工作? – 2013-02-11 23:59:03
嗯,你说得对。不要问我“为什么”(但),但[它在使用数组中的字符串时有所帮助](http://jsfiddle.net/jeroenheijmans/TXhtA/):O – Jeroen 2013-02-12 00:12:18
@MikeChristensen更新了我的答案,if我没有弄错,我发现为什么KnockoutJS会这样做。 – Jeroen 2013-02-12 01:00:40