过滤器与过滤器

时间:2015-10-05 13:52:35

标签: javascript extjs extjs4.2

我一直在努力将过滤器应用到商店。

直到最近,我一直在使用'filter'方法向商店添加多个过滤器。我喜欢这种方法,因为我可以将多个过滤器应用于商店,并使用过滤器ID跟踪/删除过滤器:

E.g:

商店示例:

storeId: 'members',
  fields: [
    { name: 'M_NAME' },
    { name: 'COUNTRY' },
    { name: 'GROUP' }
  ]

我可以将几个过滤器放在一起按国家/地区进行过滤,例如:

stores.members.addFilter({
  id: 'F_COUNTRY',
  property: 'COUNTRY',
  exactMatch: true,
  value: 'UK'
});

stores.members.addFilter({
  id: 'F_GROUP',
  property: 'GROUP',
  exactMatch: true,
  value: 'Developer'
});

到目前为止一切顺利。我可以看到我有两个过滤器使用:

  

stores.members.filters.length

使用以下方法删除单个过滤器:

  

stores.members.removeFilter( 'FILTER_NAME')

过载过滤器:

stores.members.addFilter({
  id: 'F_COUNTRY',
  property: 'COUNTRY',
  exactMatch: true,
  value: 'France'
});

我可以看到过滤器已经过载,因为stores.members.filters.length仍将返回相同数量的过滤器和stores.members.filters.getAt(filter_number).id仍会返回'F_COUNTRY'而members.filters .getAt(filter_number).value已从'UK'更改为'France'。

最近,我发现需要添加更复杂的过滤器,这些过滤器最好使用filterBy方法实现。 E.g:

stores. members.filterBy(function(record){
  return (record.get('GROUP'=='Developer') || record.get('GROUP'=='Manager'));
});

现在,我似乎发现,只要我应用此过滤器,就会忽略使用'filter'方法设置的所有先前过滤器。使用stores.members.filters.getAt(filter_number).id / value和stores.members.filters.length仍然可以看到它们,但是没有使用它们。

只要我使用'filter'和'removeFilter'方法添加,删除或重载过滤器,使用'filter'方法创建的过滤器将再次变为活动状态,并且使用'filterBy'方法创建的过滤器将变为非活动状态。

此外,如果我使用'filterBy'方法添加新过滤器,这似乎会覆盖以前的过滤器。

鉴于我无法找到有关使用filter和filterBy的明确文档,我提出以下问题:

  1. 我之前的观察是否准确?
  2. 如果是这样,那么我是否应该避免在同一个商店中使用过滤器和filterBy,因为它们似乎不是为了一起工作而设计的?
  3. 另一方面,如果过滤器和filterBy是一起使用的,那么它们是一些最佳实践规则吗?也许是一种给出过滤器ID的方法?
  4. 提前感谢所有反馈,

    亲切的问候, Chopo

    聚苯乙烯。我目前正在使用ExtJs V4.2

1 个答案:

答案 0 :(得分:1)

filter方法的文档说:"默认情况下,传递的过滤器会添加到用于过滤此商店的过滤器集合中。"。 (http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.Store-method-filter

filterBy方法的文档没有说明过滤器被添加到当前过滤器集合中,所以我猜您的观察结果是准确的。

您可以使用Filter类(http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.util.Filter)来显式创建过滤器。然后,您可以使用addFilter(...)removeFilter(...)在商店中添加或删除它们。