Arrays 基于选中复选框列表的淘汰数组筛选器

Arrays 基于选中复选框列表的淘汰数组筛选器,arrays,knockout.js,filter,Arrays,Knockout.js,Filter,我正在努力根据左侧协议下复选框列表的选择筛选正文中的列表,请参见“请帮助” filteredRecords: function(){ return ko.utils.arrayFilter(viewModel.protocoldocs,function(protocoldoc){ var flag = false; foreach(selprotocol in viewModel.selectedprotocol) { if

我正在努力根据左侧协议下复选框列表的选择筛选正文中的列表,请参见“请帮助”

filteredRecords: function(){
        return ko.utils.arrayFilter(viewModel.protocoldocs,function(protocoldoc){
           var flag = false;
    foreach(selprotocol in viewModel.selectedprotocol)
    {

        if(selprotocol.id === protocoldoc.pronumber)
        flag = true;     
    }
    return flag;
        })};

您可以使用一个计算的可观测值来实现此目的,如下所示

viewModel.filteredProtocols = ko.computed(function () {
  var selectedProtocols = ko.utils.arrayFilter(viewModel.protocol(), function (p) {
    return p.selected();
  });
  if (selectedProtocols.length == 0)   //if none selected return all
    return viewModel.protocoldocs();
  else { //other wise only return selected protocoldocs
    return ko.utils.arrayFilter(viewModel.protocoldocs(), function (item) {
      return ko.utils.arrayFilter(selectedProtocols, function (p) {
        return p.id == item.id
      }).length > 0;
    });
  }
})
并将结果表绑定到此filteredProtocol。我也修改了一些东西

我为协议添加了一个选中的标志以保留选中的值

<input type="checkbox" data-bind="checked:selected, attr: {id: 'checkBox' + id}">

你可以在这里找到一个工作样本

谢谢你,山姆。你救了我一天。这就是我要找的。我唯一要做的就是将compute函数中的return p.id==item.id更改为return p.name==item.pronumber,这样它将根据协议编号而不是id进行过滤。我将在site、branchs等下面添加更多过滤器复选框,并修改您创建的计算函数以获得过滤结果。让我知道这是不是正确的方向。谢谢您!
function protocol(id, name) {
  this.id = id;
  this.name = name;
  this.selected = ko.observable(false);
}