过滤器与过滤器
Filter vs FilterBy
我一直在为商店应用过滤器。
直到最近,我一直在使用 '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.filters.length
删除个别过滤器使用:
stores.members.removeFilter('filter_name')
或者重载过滤器:
stores.members.addFilter({
id: 'F_COUNTRY',
property: 'COUNTRY',
exactMatch: true,
value: 'France'
});
我可以看到过滤器已过载,因为 stores.members.filters.length 仍将 return 相同数量的过滤器并且 stores.members.filters.getAt(filter_number).id 仍将 return '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'));
});
现在,我似乎发现,一旦我应用此过滤器,所有以前使用 'filter' 方法设置的过滤器都将被忽略。使用 stores.members.filters.getAt(filter_number).id / value 和 stores.members.filters.length 仍然可见,但未使用。
只要我使用 'filter' 和 'removeFilter' 方法添加、删除或重载过滤器,使用 'filter' 方法创建的过滤器就会再次激活,并且使用'filterBy' 方法失效。
此外,如果我使用 'filterBy' 方法添加新过滤器,这似乎会覆盖以前的过滤器。
鉴于我找不到关于一起使用 filter 和 filterBy 的明确文档,我提出以下问题:
- 我之前的观察准确吗?
- 如果是这样,我是否应该因此而避免在同一商店中一起使用 filter 和 filterBy,因为它们似乎不是为协同工作而设计的?
- 另一方面,如果 filter 和 filterBy 打算一起使用,它们是否有一些最佳实践规则?也许是一种为过滤器提供 ID 的方法?
提前感谢所有反馈,
亲切的问候,
乔波
Ps。我目前正在使用 ExtJs V4.2
filter
方法的文档说:"By default, the passed filter(s) are added to the collection of filters being used to filter this Store."。 (http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.Store-method-filter)
filterBy
方法的文档没有提及将过滤器添加到当前过滤器集合中,所以我想您的观察是准确的。
您可以使用 Filter
class (http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.util.Filter) 显式创建过滤器。然后,您可以使用 addFilter(...)
和 removeFilter(...)
.
在商店中添加或删除它们
我一直在为商店应用过滤器。
直到最近,我一直在使用 '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.filters.length
删除个别过滤器使用:
stores.members.removeFilter('filter_name')
或者重载过滤器:
stores.members.addFilter({
id: 'F_COUNTRY',
property: 'COUNTRY',
exactMatch: true,
value: 'France'
});
我可以看到过滤器已过载,因为 stores.members.filters.length 仍将 return 相同数量的过滤器并且 stores.members.filters.getAt(filter_number).id 仍将 return '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'));
});
现在,我似乎发现,一旦我应用此过滤器,所有以前使用 'filter' 方法设置的过滤器都将被忽略。使用 stores.members.filters.getAt(filter_number).id / value 和 stores.members.filters.length 仍然可见,但未使用。
只要我使用 'filter' 和 'removeFilter' 方法添加、删除或重载过滤器,使用 'filter' 方法创建的过滤器就会再次激活,并且使用'filterBy' 方法失效。
此外,如果我使用 'filterBy' 方法添加新过滤器,这似乎会覆盖以前的过滤器。
鉴于我找不到关于一起使用 filter 和 filterBy 的明确文档,我提出以下问题:
- 我之前的观察准确吗?
- 如果是这样,我是否应该因此而避免在同一商店中一起使用 filter 和 filterBy,因为它们似乎不是为协同工作而设计的?
- 另一方面,如果 filter 和 filterBy 打算一起使用,它们是否有一些最佳实践规则?也许是一种为过滤器提供 ID 的方法?
提前感谢所有反馈,
亲切的问候, 乔波
Ps。我目前正在使用 ExtJs V4.2
filter
方法的文档说:"By default, the passed filter(s) are added to the collection of filters being used to filter this Store."。 (http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.Store-method-filter)
filterBy
方法的文档没有提及将过滤器添加到当前过滤器集合中,所以我想您的观察是准确的。
您可以使用 Filter
class (http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.util.Filter) 显式创建过滤器。然后,您可以使用 addFilter(...)
和 removeFilter(...)
.