Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 选中由JSON绑定的knockout.js中的多个复选框_Javascript_Jquery_Json_Knockout.js - Fatal编程技术网

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

Javascript 选中由JSON绑定的knockout.js中的多个复选框,javascript,jquery,json,knockout.js,Javascript,Jquery,Json,Knockout.js,我不熟悉JSON和knockout。我面临的一个问题是,我有一个JSON数据集,例如定义了10个布尔值 IsHappy = true; IsSad = false; IsAngry = true; 等等。我的ViewModel是从JSON字符串创建的,我将值绑定到复选框,如下所示:- <input type="checkbox" data-bind="checked: IsHappy"/> <input type="checkbox" data-bind="checked:

我不熟悉JSON和knockout。我面临的一个问题是,我有一个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将其保存到服务器

这一切都很好,但我不知道如何实现“全选”功能。我已经在网上阅读了示例(),其中包括创建ObservalArray和切换IsSelected()observable,但在我的例子中,如何将不同的JSON属性映射到IsSelected()属性,以及切换IsSelected()observable如何更新原始JSON属性


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

您需要一个属性名数组(您可以显式列出它们,也可以使用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);

演示。

我对您使用解决方案生成JSFIDLE的速度感到震惊和惊讶。。。!!!作为跟进,是否有任何方法将值重置回原始值(真、假、真)?没有简单的方法恢复以前的值。您必须将这些值临时存储在某个位置,或者从服务器重新检索它们。有一些插件/模式可以做到这一点: