我一直在将过滤器应用于商店。

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

例如。:

示例商店:

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.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已从“英国”更改为“法国”。

最近,我发现有必要添加更复杂的过滤器,最好使用filterBy方法来实现。例如:
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”方法创建的过滤器将再次变为 Activity 状态,而使用“filterBy”方法创建的过滤器将变为非 Activity 状态。

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

鉴于找不到关于同时使用filter和filterBy的清晰文档,我提出以下问题:
  • 我以前的观察准确吗?
  • 如果是这样,结果是,我是否应该避免在同一商店同时使用filter和filterBy,因为它们似乎没有设计成可以协同工作?
  • 另一方面,如果filter和filterBy打算一起使用,那么它们是一些最佳实践规则吗?也许是一种通过ID赋予filter的方法?

  • 预先感谢您的所有反馈,

    亲切的问候,
    乔波

    附言我目前正在使用ExtJs V4.2

    最佳答案

    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(...)在商店中添加或删除它们。

    关于javascript - 筛选vs依筛选,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32950341/

    10-11 23:57