根据数组字段过滤dstore集合

时间:2018-06-06 20:55:46

标签: dojo dgrid 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),但这对我没什么帮助。

非常感谢任何指导。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以找到有关过滤here的文档。

在您的情况下,.contains()将无效,因为它旨在处理数组类型的值。您要在此处过滤的是对象数组。以下是文档链接的引用:

  

包含:对象的过滤器,其中指定属性的值是数组,并且数组包含任何等于提供的值或满足提供的表达式的值。

在我看来,这里最好的方法是覆盖您希望按团队名称过滤的过滤方法。以下是一些示例代码:

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上应用复杂过滤的最简单方法。

您可能想要阅读的一些类似问题:linklinklink