過濾器不改變源陣列。它產生另一個數組,然後在模板中呈現。目前無法訪問它,但另一方面,我不認爲這是真的有必要。如果您需要在代碼中使用過濾數組,只需將它放在模板中而不是原始模板中即可。
所以,你要的是這樣的:
app.component.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';
}
}
app.component.html
<div>
<input type="text" [(ngModel)]="filterId" />
<div *ngFor="let item of filteredItems">{{item.text}}</div>
</div>
app.module .ts
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 {
}
filter.pipe.ts
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]));
});
}
}
強烈建議您不要使用管道進行過濾和排序爲這裏討論:https://angular.io/guide/pipes#no -filter-pipe相反,在組件類中進行篩選。我在這裏有一個例子:https://blogs.msmvps.com/deborahk/filtering-in-angular/ – DeborahK