首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >筛选表的ToolBar

筛选表的ToolBar
EN

Stack Overflow用户
提问于 2019-01-18 09:52:34
回答 2查看 165关注 0票数 0

我有一个从a中获取数据的user[]对象,我试图基于fullName(对象的属性)过滤数据,在keyup.enter上它调用filterUser() function.This是我编写筛选逻辑的地方。数据得到一个过滤器,但角不能渲染它,我不知道我做错了什么。

我将过滤后的数据保存在类型为filterData的对象User[]中。

User-list.html

代码语言:javascript
复制
<div *ngIf="users?.length > 0">
<div> <input type="text" (keyup.enter)="filterUser($event)"> </div> <!--function triggering here-->
<div *ngFor="let item of items">
{{item.attribute.fullName}}
</div>
</div>

User-list.component.ts

代码语言:javascript
复制
// assuming users has some data
items: User[]
filterData: User[];
 filterUser( searchTerm: string) {
    this.filterCount = 0;
    console.log('searchTerm', searchTerm);
    console.log(typeof(this.items));
    if (!this.items || !searchTerm) {
      return this.items;
    }
    for (let i = 0; i < this.items.length; i++) {
      if (this.items[i].attributes.fullName.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {         this.filterData[i].attributes.fullName = this.items[i].attributes.fullName;
        this.filterCount++;
      }
    }
    this.items = this.filterData;// I'm not able to copy data back to this.items
  }

我不知道我错过了什么。我需要使用ngOnChanges()吗?

EN

回答 2

Stack Overflow用户

发布于 2019-05-22 07:57:32

您可以通过创建自定义管道来过滤它。

filter.pipe.ts

代码语言:javascript
复制
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'filter'
})
export class FilterPipe implements PipeTransform {
    transform(items: any[], searchText: string): any[] {
        searchText=searchText
        if(!items){ return ;}
        if(!searchText){
            return items;
        }
        return items.filter( it => {
            return it['fullName'].toLowerCase().includes(searchText);
        });
    }
}

在app.module.ts文件中注册管道

代码语言:javascript
复制
import {
  FilterPipe
} from 'PipePath'; //give the path of custom created pipe

declarations: [...,FilterPipe],

user-list.html

代码语言:javascript
复制
<div *ngIf="users?.length > 0">
<div> <input type="text" (keyup.enter)="filterUser($event)" [(ngModel)]="search"> </div>
<div *ngFor="let item of items | filter : search">
{{item.attribute.fullName}}
</div>
</div>

当我们使用ngModel时,在ts文件中声明搜索变量。

user-list.ts

代码语言:javascript
复制
search;

这会解决你的问题。

票数 1
EN

Stack Overflow用户

发布于 2019-01-18 10:41:26

将匹配项复制到filteredData列表时出错。下面是使用副本的一种可能的解决方案:

代码语言:javascript
复制
class Test {
    // assuming users has some data
    constructor() {
        this.items = [
            { attributes: { fullName: 'toto1' } },
            { attributes: { fullName: 'toto2' } },
            { attributes: { fullName: 'tutu3' } }
        ];
        this.filterData = [];
    }
    filterUser(searchTerm) {
        this.filterCount = 0;
        console.log('searchTerm', searchTerm);
        console.log(typeof (this.items));
        if (!this.items || !searchTerm) {
            return this.items;
        }
        for (let i = 0; i < this.items.length; i++) {
            if (this.items[i].attributes.fullName.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {
                this.filterData[i] = { ...this.items[i] }; // Copy full object using spread operator
                this.filterCount++;
            }
        }
        this.items = this.filterData;// I'm not able to copy data back to this.items
    }
}
let test = new Test();
test.filterUser('toto');
console.log(test.items);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54251402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档