Angular 如何获得过滤(使用管道)列表?

Angular 如何获得过滤(使用管道)列表?,angular,typescript,pipe,Angular,Typescript,Pipe,我有一个要过滤的管道: @Pipe({ name: 'filter' }) export class FilterPipe implements PipeTransform { transform(items: Array<any>, filter: { [key: string]: any }): Array<any> { return items.filter(item => { let notMatchingField = Object

我有一个要过滤的管道:

@Pipe({
name: 'filter'
})
export class FilterPipe implements PipeTransform {
transform(items: Array<any>, filter: { [key: string]: any }): Array<any> {
    return items.filter(item => {
        let notMatchingField = Object.keys(filter)
            .find(key => item[key] !== filter[key]);
        return !notMatchingField; // true if matches all fields
    });
}


}

所以我运行它,我得到的所有对象的名称都是'Gülcan'在我的表中。但我在另一个页面中写道:
console.log(this.\u FilteredList)
我看到了该列表中的所有项目。是否仍要仅查看那些已筛选的项目?

请尝试使用此代码进行筛选。这对我很有用:

import {Pipe, PipeTransform} from '@angular/core';

@Pipe({
    name: 'filterPipe'
})
export class FilterPipe implements PipeTransform {
    transform(data: any[], keys: string[], filter: string) {
        if (!filter || !keys || keys.length <= 0) {
            return data;
        } else {
            return data.filter((elem) => {
                var matched = false;
                for (let key of keys) {
                    matched = matched || elem[key].toLocaleLowerCase().indexOf(filter.toLocaleLowerCase()) !== -1
                    if (matched) {
                        return true;
                    }
                }
                return matched;
            });
        }
    }
}
从'@angular/core'导入{Pipe,PipeTransform};
@烟斗({
名称:'filterPipe'
})
导出类FilterPipe实现PipeTransform{
转换(数据:任意[],键:字符串[],筛选器:字符串){
如果(!filter | |!keys | | keys.length{
var匹配=假;
对于(让钥匙中的钥匙){
matched=matched | | elem[key].toLocaleLowerCase().indexOf(filter.toLocaleLowerCase())!=-1
如果(匹配){
返回true;
}
}
返回匹配;
});
}
}
}
更新 HTML:


尝试将此代码用于过滤器。这对我很有用:

import {Pipe, PipeTransform} from '@angular/core';

@Pipe({
    name: 'filterPipe'
})
export class FilterPipe implements PipeTransform {
    transform(data: any[], keys: string[], filter: string) {
        if (!filter || !keys || keys.length <= 0) {
            return data;
        } else {
            return data.filter((elem) => {
                var matched = false;
                for (let key of keys) {
                    matched = matched || elem[key].toLocaleLowerCase().indexOf(filter.toLocaleLowerCase()) !== -1
                    if (matched) {
                        return true;
                    }
                }
                return matched;
            });
        }
    }
}
从'@angular/core'导入{Pipe,PipeTransform};
@烟斗({
名称:'filterPipe'
})
导出类FilterPipe实现PipeTransform{
转换(数据:任意[],键:字符串[],筛选器:字符串){
如果(!filter | |!keys | | keys.length{
var匹配=假;
对于(让钥匙中的钥匙){
matched=matched | | elem[key].toLocaleLowerCase().indexOf(filter.toLocaleLowerCase())!=-1
如果(匹配){
返回true;
}
}
返回匹配;
});
}
}
}
更新 HTML:


过滤器不会更改源数组。它将生成另一个数组,然后在模板中呈现该数组。目前还没有办法访问它,但另一方面,我认为这不是真的必要。如果在代码中需要过滤数组,只需将其放在那里,并在模板中呈现,而不是在原始模板中呈现

所以,你想要的是这样的:

应用程序组件.ts

import {Component} from '@angular/core';
import {AppFilter} from './filter.pipe';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent {
    items: any[] = [];
    filteredItems: any[] = [];
    private _filterId: string;
    get filterId(): string {
        return this._filterId;
    }
    set filterId(val: string) {
        this._filterId = val;
        this.filteredItems = this.filter.transform(this.items, {id: val});
    }
    constructor(private filter: AppFilter) {
        this.items = [
            {
                id: '1',
                text: 'item 1'
            },
            {
                id: '2',
                text: 'item 2'
            }
        ];
        this.filterId = '1';
    }
}
import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';

import {AppComponent} from './app.component';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {AppFilter} from './filter.pipe';

@NgModule({
    declarations: [
        AppComponent,
        AppFilter
    ],
    imports: [
        BrowserModule,
        FormsModule,
        ReactiveFormsModule
    ],
    providers: [AppFilter], // <--- !!! it must be provided by some component or module
    bootstrap: [AppComponent]
})
export class AppModule {
}
import {Pipe, PipeTransform} from '@angular/core';

@Pipe({
    name: 'filter'
})
export class AppFilter implements PipeTransform {
    transform(value: any, filter: {[key: string]: any}): any {
        if (!value || !filter) {
            return value;
        }
        return value.filter(item => {
            return !Object.keys(filter).find(key => filter[key] && (item[key] !== filter[key]));
        });
    }
}
app.component.html

<div>
    <input type="text" [(ngModel)]="filterId" />
    <div *ngFor="let item of filteredItems">{{item.text}}</div>
</div>

筛选器不会更改源数组。它将生成另一个数组,然后在模板中呈现该数组。目前还没有办法访问它,但另一方面,我认为这不是真的必要。如果在代码中需要过滤数组,只需将其放在那里,并在模板中呈现,而不是在原始模板中呈现

所以,你想要的是这样的:

应用程序组件.ts

import {Component} from '@angular/core';
import {AppFilter} from './filter.pipe';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent {
    items: any[] = [];
    filteredItems: any[] = [];
    private _filterId: string;
    get filterId(): string {
        return this._filterId;
    }
    set filterId(val: string) {
        this._filterId = val;
        this.filteredItems = this.filter.transform(this.items, {id: val});
    }
    constructor(private filter: AppFilter) {
        this.items = [
            {
                id: '1',
                text: 'item 1'
            },
            {
                id: '2',
                text: 'item 2'
            }
        ];
        this.filterId = '1';
    }
}
import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';

import {AppComponent} from './app.component';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {AppFilter} from './filter.pipe';

@NgModule({
    declarations: [
        AppComponent,
        AppFilter
    ],
    imports: [
        BrowserModule,
        FormsModule,
        ReactiveFormsModule
    ],
    providers: [AppFilter], // <--- !!! it must be provided by some component or module
    bootstrap: [AppComponent]
})
export class AppModule {
}
import {Pipe, PipeTransform} from '@angular/core';

@Pipe({
    name: 'filter'
})
export class AppFilter implements PipeTransform {
    transform(value: any, filter: {[key: string]: any}): any {
        if (!value || !filter) {
            return value;
        }
        return value.filter(item => {
            return !Object.keys(filter).find(key => filter[key] && (item[key] !== filter[key]));
        });
    }
}
app.component.html

<div>
    <input type="text" [(ngModel)]="filterId" />
    <div *ngFor="let item of filteredItems">{{item.text}}</div>
</div>

对不起,忘记HTML了。更新在您的更新之前有错误,现在错误消失了。但它现在不过滤对不起,忘记HTML了。更新在您的更新之前有错误,现在错误消失了。但是它现在不过滤。强烈建议您不要像这里讨论的那样使用管道进行过滤和排序:而是在组件类中进行过滤。这里有一个例子:强烈建议不要像这里讨论的那样使用管道进行过滤和排序:而是在组件类中进行过滤。我举了一个例子: