【问题标题】:Filter vs FilterBy过滤器与过滤器
【发布时间】:2015-10-09 03:12:24
【问题描述】:

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

直到最近,我一直在使用“过滤器”方法向商店添加多个过滤器。我喜欢这种方法,因为我可以将多个过滤器应用于商店并使用过滤器 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.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 方法来实现。例如:

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

现在,我似乎发现,一旦我应用此过滤器,之前使用“过滤器”方法设置的所有过滤器都将被忽略。使用stores.members.filters.getAt(filter_number).id / value 和stores.members.filters.length 仍然可以看到它们,但没有使用。

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

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

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

  1. 我之前的观察结果准确吗?
  2. 如果是这样,我是否应该因此简单地避免在同一商店中同时使用 filter 和 filterBy,因为它们似乎不能一起使用?
  3. 另一方面,如果 filter 和 filterBy 打算一起使用,它们是否有一些最佳实践规则?也许是一种通过 ID 提供 filterBy 的方法?

提前感谢所有反馈,

亲切的问候, 肖波

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

【问题讨论】:

    标签: javascript extjs extjs4.2


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

    【讨论】: