检查由JSON绑定的knockout.js中的多个复选框

时间:2014-05-06 09:55:50

标签: javascript jquery json knockout.js

我是JSON和淘汰赛的新手。我面临一个问题,就是我在JSON中有一个数据集,例如10个布尔值。例如。

IsHappy = true;
IsSad = false;
IsAngry = true;

等。我的ViewModel是从JSON字符串创建的,我将值绑定到复选框: -

<input type="checkbox" data-bind="checked: IsHappy"/>
<input type="checkbox" data-bind="checked: IsSad"/>
<input type="checkbox" data-bind="checked: IsAngry"/>

我将ViewModel转换回JSON并将其转换为ajax以保存到服务器。

这一切都很好但是我无法弄清楚如何实现'全选'功能。我已经通过在线阅读的例子(http://jsfiddle.net/rniemeyer/eT7xV/)阅读了这个例子,其中包括创建一个observableArray并切换IsSelected()可观察对象,但在我的例子中,我如何将不同的JSON属性映射到IsSelected()属性,同样如何做切换IsSelected()可观察更新原始JSON属性。

我尝试使用jquery设置attr('checked'),但这样做会检查框但不更新ViewModel,这意味着当我将其转换回JSON并将其发布到服务器端时,未检测到任何更改。 / p>

1 个答案:

答案 0 :(得分:1)

您需要拥有一个属性名称数组(您可以明确地列出它们,也可以使用Object.keys来收集它们)。

然后,当您检查allSelected支票簿时,请浏览这些属性名称并根据newValue设置它们:

viewModel.allSelected.subscribe(function(newValue) {
    var _this = this;

    //var checkboexes = ['IsHappy', 'IsSad', 'IsAngry'];
    var checkboexes = Object.keys(_this).filter(function(k) { 
       return k.indexOf('Is') == 0; 
    });

    ko.utils.arrayForEach(checkboexes, function(banner) {        
       _this[banner](newValue); 
    });
}, viewModel);

演示JSFiddle