2012-01-31 108 views
6

我使用淘汰赛映射JSON obejct用户控制所有的组合框,我有一个复选框列表, 它们看起来像淘汰赛选择/取消

<input type="checkbox" data-bind="checked: IsEnabled1" /> 

我有JSONObject的

var viewModel = { 
      IsEnabled1 :ko.observable(true),    
      IsEnabled2 :ko.observable(true), 
      IsEnabled3 :ko.observable(false) 
     }; 
    ... 
    ko.applyBindings(viewModel); 

我想添加将检查/取消选中所有其他的全局复选框,我在JavaScript端进行了此更改,但全局复选框更新UI部分,但它们来自单独复选框的数据不映射到JSON对象。

全球复选框

$("#GeneralTable thead tr th:first input:checkbox").click(function() { 
      var checkedStatus = this.checked; 
      $("#GeneralTable tbody tr td:first-child input:checkbox").each(function() { 
       this.checked = checkedStatus;      
      }); 

     }); 

这个代码我的JSON对象后,包含不相关的UI数据。

如何更新JS端更改后的所有JSON复选框?

+1

您发布的代码是不够的,我们来回答你的问题。 – 2012-01-31 15:00:49

+0

现在应该会更好。谢谢。 – 2012-01-31 15:18:14

+1

代码中的问题,即与节点交互的问题。但是你需要与数据交互。这在MVVM世界更好:-)请检查我的答案。我认为它会为你工作。 – Romanych 2012-01-31 15:32:14

回答

16

请检查例子:http://jsfiddle.net/MenukaIshan/5gaLjh2c/

我认为这正是你所需要的。所有物品都有IsChecked可观察财产。 ViewModel包含计算的observable(可读和可写)来检查或取消选中所有项目。

+0

这是使用的完美例子。让我的一天两次! – 2014-09-22 13:13:08

+0

使用类似的代码。我尝试了你的小提琴,但在我的情况下,我正在使用knockout-3.2.0.js,它不工作(即使在小提琴中),但使用knockout-2.0.0.js。任何线索。 – 2016-04-07 10:23:37

+0

3.2.4对此没有任何作用 – 2017-06-19 16:48:13

2

这里有http://jsfiddle.net/rniemeyer/kXYuU/

上述解决方案可以通过两种方式

得到改善 - 要做出AllChecked假空列表,我们需要检查长度

- 要减少的替代解决方案选择所有的长列表时数重新计算,我们需要增加油门

self.AllChecked = ko.computed({ 
    read: function() { 
     var firstUnchecked = ko.utils.arrayFirst(self.Items, function(item) { 
      return item.IsChecked() == false; 
     }); 
     return self.Items.length && !firstUnchecked; 
    }, 
    write: function(value) { 
     ko.utils.arrayForEach(self.Items, function(item) { 
      item.IsChecked(value); 
     }); 
    } 
}).extend({ throttle: 1 });