使用Knockout.js创建数据绑定复选框时未选择任何内容
Nothing selected when creating data-bound check boxes with 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]);
};
现在,我想创建一个复选框列表,标签为Test1、Test 2和Test 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的bug。我希望输入的值是数字,因为这就是我将其绑定到的
提交的Bug:
由于上面的代码没有像文档中那样工作,我在GitHub上提交了一个bug。
您需要稍微更改一下,以检查您正在渲染的区域的AreaId
是否包含在AreasImpacted
数组中:
data-bind="value: AreaId, checked: $parent.AreasImpacted.indexOf(AreaId) >= 0"
看看这个小提琴的工作演示。
注意:使用此技术,选中或取消选中其中一个绑定复选框将不会更新数据源。
或者,您可以使数组成为字符串列表,例如:
this.AreasImpacted = ko.observableArray(['1', '2']);
请看这把小提琴的演示。
正如评论中所指出的,KnockoutJS文档似乎表明OP的原始语法应该可以工作。您甚至可以通过将数组中的项制作成字符串(demo)来实现这一点。
KnockoutJS源代码可以告诉我们为什么会发生这种情况。查看checked.js
默认绑定,查看将决定是否检查输入的相关代码位:
element.checked = ko.utils.arrayIndexOf(value, element.value) >= 0;
在此背景下:
value
是区域id的数组(数字,在OP的原始代码中)element
是<input .../>
复选框HtmlElement
因此,element.value
将始终是字符串类型,这就是为什么只有当数组中的项目也是字符串时才会选中复选框的原因。
这是KnockoutJS中的错误,还是一些意外但合乎逻辑的行为:我不确定。
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 使用正则表达式选择圆括号内的内容
- 如果没有从下拉列表中选择任何值,则允许使用php、mysql、javascript将文本框添加到mysql表中
- Select2js插件无法选择任何选项
- JQuery Selector未选择任何内容
- 是否有任何内置方法可以更改JavaScript对象'的属性设置为某个值
- 如果使用jquery在页面加载时未选择任何选项,如何禁用下拉列表
- Jquery自动完成:如果没有选择任何项目,则使tab键选择第一个项目
- select2 使用 AJAX 加载数据不能选择任何选项
- 当“不相关”的 html 选择元素没有选择任何选项时,如何退出 jQuery 事件
- dynamic制作的下拉列表,当我选择任何列表时,如何在每个下拉列表上使用活动类
- 下拉列表中的选定索引在未选择任何值时引发错误
- 选择框内的选择和其他
- 当用户在命令提示符中选择任何字符串时,节点Js不为任何请求提供服务
- Jquery日期选择器-防止选择范围内的不可用日期
- 使用 CasperJS 时,是否可以在执行任何内联或外部 Javascript 之前与加载页面的 DOM 进行交互
- 正则表达式选择任何 html 标记之间的字符串
- 清除搜索词,并在选择任何项目后重新加载 Select2 输入的所有项目
- 单选按钮 .val() 返回不为空的值,即使未选择任何单选按钮
- 不能在可拖动模态窗口内选择任何内容