根据数组字段过滤 dstore 集合
Filtering dstore collection against an array field
我正在尝试通过具有值数组的字段来过滤 dstore 集合。我的 json 数据如下(简化):
[{
user_id: 1,
user_name: "John Doe",
teams: [{team_id: 100, team_name: 'Red Sox'}, {team_id: 101, team_name: 'Buccaneers'}]
},
{
user_id: 2,
user_name: "Fred Smith",
teams: [{team_id: 100, team_name: 'Buccaneers'}, {team_id: 102, team_name: 'Rays'}]
}]
我可以对用户名字段进行简单的过滤,而且效果很好。
this.dstoreFilter = new this.dstore.Filter();
var results = this.dgrid.set('collection', this.dstore.filter(
this.dstoreFilter.match('user_name',new RegExp(searchTerm, 'i'))
));
但是,我如何构建一个过滤器来只显示那些为红袜队效力的球员?我试过使用 filter.contains() 方法,但我找不到任何关于它如何工作的充分文档。查看 dstore 代码,我发现 filter.contains() 方法具有以下签名:(value, required, object, key),但这对我帮助不大。
任何指导将不胜感激。提前致谢!
您可以找到有关过滤的文档 here。
在您的情况下,.contains()
将不起作用,因为它旨在处理数组类型的值。您要在此处过滤的是对象数组。这是文档 link:
中的引述
contains: Filters for objects where the specified property's value is an array and the array contains any value that equals the provided value or satisfies the provided expression.
在我看来,这里最好的方法是覆盖要按团队名称过滤的过滤方法。这是一些示例代码:
this.grid.set('collection', this.dstore.filter(lang.hitch(this, function (item) {
var displayUser = false;
for(var i=0; i < item.teams.length; i++){
var team = item.teams[i];
if(team.team_name == 'Red Sox'){
displayUser = true;
break;
}
}
return displayUser;
})));
this.grid.refresh();
对于商店中的每个用户,如果返回 false
,则显示设置为 false,如果返回 true
,则显示。这是迄今为止我所知道的对 dstore
.
应用复杂过滤的最简单方法
您可能想要阅读的一些类似问题:, ,
我正在尝试通过具有值数组的字段来过滤 dstore 集合。我的 json 数据如下(简化):
[{
user_id: 1,
user_name: "John Doe",
teams: [{team_id: 100, team_name: 'Red Sox'}, {team_id: 101, team_name: 'Buccaneers'}]
},
{
user_id: 2,
user_name: "Fred Smith",
teams: [{team_id: 100, team_name: 'Buccaneers'}, {team_id: 102, team_name: 'Rays'}]
}]
我可以对用户名字段进行简单的过滤,而且效果很好。
this.dstoreFilter = new this.dstore.Filter();
var results = this.dgrid.set('collection', this.dstore.filter(
this.dstoreFilter.match('user_name',new RegExp(searchTerm, 'i'))
));
但是,我如何构建一个过滤器来只显示那些为红袜队效力的球员?我试过使用 filter.contains() 方法,但我找不到任何关于它如何工作的充分文档。查看 dstore 代码,我发现 filter.contains() 方法具有以下签名:(value, required, object, key),但这对我帮助不大。
任何指导将不胜感激。提前致谢!
您可以找到有关过滤的文档 here。
在您的情况下,.contains()
将不起作用,因为它旨在处理数组类型的值。您要在此处过滤的是对象数组。这是文档 link:
contains: Filters for objects where the specified property's value is an array and the array contains any value that equals the provided value or satisfies the provided expression.
在我看来,这里最好的方法是覆盖要按团队名称过滤的过滤方法。这是一些示例代码:
this.grid.set('collection', this.dstore.filter(lang.hitch(this, function (item) {
var displayUser = false;
for(var i=0; i < item.teams.length; i++){
var team = item.teams[i];
if(team.team_name == 'Red Sox'){
displayUser = true;
break;
}
}
return displayUser;
})));
this.grid.refresh();
对于商店中的每个用户,如果返回 false
,则显示设置为 false,如果返回 true
,则显示。这是迄今为止我所知道的对 dstore
.
您可能想要阅读的一些类似问题: