在datagrid中搜索

时间:2017-12-10 23:19:12

标签: angular vmware-clarity

我正在使用清晰度数据网格,我希望能够根据搜索过滤器过滤整个网格内容。

我试图创建一个管道。管道包含在app.module中。管道在第一次加载组件时被调用(并且不会发生任何事情),但由于某种原因,当我把东西放进我的时候,没有任何事情发生。没有打电话给用户过滤器'管。

user.component.html

<input type="text" id="search" placeholder="Search..." ([ngModel])="searchTerm">
...
<clr-dg-row *clrDgItems="let user of users | userFilter: searchTerm" [clrDgItem]="user" (click)="backupSelectedUser(user)">
  <clr-dg-cell>{{ user.username }}</clr-dg-cell>
  <clr-dg-cell>{{ user.name }}</clr-dg-cell>
  <clr-dg-cell>{{ user.firstName }}</clr-dg-cell>
</clr-dg-row>
...

search.pipe.ts

transform(items: any, term: any): any {
  if (term === undefined) {
    return items;
  }

  return items.filter(function (item) {
    for (const property in item) {
      if (item[property] === null) {
        continue;
      }
      if (item[property].toString().toLowerCase().includes(term.toLowerCase())) {
        return true;
      }
    }
    return false;
  });
}

更新:我为ngModel做了一点拼写错误。它应该是[(ngModel)]而不是!

1 个答案:

答案 0 :(得分:2)

我记得几个月前写了一个关于这个问题的傻瓜:https://plnkr.co/edit/59FZKya2Soa7Ofnlge3B?p=preview

根据您的描述,这正是您想要的。您不应该像在迭代器中那样使用管道,因为它会强制Angular为每次更改检测重新计算它们,这太重了。因此,建议的解决方案是坚持*clrDgItems="let user of users",并将users属性本身设置为已过滤的数组,以便您只在用户键入内容时重新计算过滤结果。