knockout.js复选框与observableArrays的双向绑定

时间:2014-04-23 07:47:44

标签: javascript checkbox knockout.js

我是淘汰赛的新手,我在让复选框做我想做的事情时遇到了一些麻烦。首先,这是我迄今为止尝试过的小提琴:http://jsfiddle.net/imagitron/mMc6k/,还有令人讨厌的代码行:

<input type="checkbox" data-bind="checked: $root.selectedItems"/>

基本上,我要做的是通过复选框链接两个数组,这样当我单击复选框时,它会存储定义数组中的对象并将其保存到selectedItems数组。当我按下按钮时,removeItems函数也没有清除数组。

先谢谢!

1 个答案:

答案 0 :(得分:3)

据我所知,淘汰赛不支持开箱即用。 checked绑定将单个复选框的状态绑定到单个布尔属性。但是,要以两种方式工作,您需要指定函数名称而不是函数调用($root.someProperty而不是$root.someProperty())。

value绑定对复选框没有意义。它用于绑定其他输入字段的值,例如文本框。

为了达到你想要的效果,你可以为每个复选框定义一个带有对象的数组,如下所示:

var items = ko.mapping.fromJS([
    { label: 'Foo', checked: false },
    { label: 'Bar', checked: false }
]);

并像这样绑定它:

<!-- ko foreach: items -->

    <input type="checkbox" data-bind="checked: checked"/>
    <span data-bind="text: label"/>

<!-- /ko -->

然后使用ko.computed函数检索数组的已检查值:

var checkedItems = ko.computed(function() {
    return _.filter(items, function (item) { return item.checked() });
});

(这是下划线库的隐藏广告 - 如果你没有它,那么就我记得,淘汰赛也有类似的功能)