内部过滤器在Knockout JS中无法正常工作

时间:2014-08-06 12:09:01

标签: javascript knockout.js

我有大小为3的静态数据数组。

我在右侧显示数组。

上面有一个文本框用于过滤。 我已经为它采取了2个模型。

一个是field,第二个是subfield

一个字段可以有多个sub fields。 我正在field以及subfields上进行过滤。 它适用于字段,但在subfields上显示了一些堰输出。 只有一个条件是,如果在数组中添加field's filtered data,那么它不应该用于subfield,如果在字段中找不到匹配,则它可以进入subfields然后添加数据到过滤数组。

我的fiddle

1 个答案:

答案 0 :(得分:1)

问题是你用来过滤数据的情况。因为你有两个以上的子字段,所以对于子域的每个匹配,相同的数据被推入arr,这是获得意外结果的主要原因。

 self.filteredList = ko.computed(function() {
  var filter = self.filter(),
  arr = [];
if (filter) {
  ko.utils.arrayForEach(self.controlFields(), function(item) {
    if (item.code().match(filter) || item.title().toLowerCase().match(filter.toLowerCase())) {
      arr.push(item);
    }
      ko.utils.arrayForEach(item.subFields(), function(sf) {
        if (sf.title().toLowerCase().match(filter.toLowerCase())) {
          var found = ko.utils.arrayFirst(arr, function(k) {
            return item.title() === k.title() && item.code()===k.code();
          });
          if (!found) {
            arr.push(item);
          }
        }
      });

   });
  } else {
   arr = self.controlFields();
  }
 return arr;
});

Demo