Angular 管道 returns 值,但 ngFor 不会显示它们
Angular Pipe returns values, but ngFor won't display them
我有一个管道,它只用完全匹配的方式过滤我的 ngFor,我通过点击过滤参数来过滤它。
这是我的烟斗:
transform(werte: any[], kriterium: string, gruppe): any[] {
if (!werte) {
return [];
}
if (!gruppe || gruppe.length === 0) {
return werte;
}
return werte.filter(it =>
it[kriterium] === gruppe);
}
这是我的 HTML:
<mat-drawer-container class="example-container">
<mat-drawer mode="side" opened class="side-nav">
<!-- <mat-card class="mat-card">Kategorien:</mat-card> -->
<div *ngFor="let skillGruppe of skillGruppen | unique:'skillGruppe'">
<button mat-button class="filter">
<div (click)="filtereSkills(filter.textContent)" #filter>
{{ skillGruppe.skillGruppe }}
</div>
</button>
</div>
</mat-drawer>
<mat-drawer-content>
<div *ngIf="SKILLS?.length > 0; else noItem">
<div *ngFor="let skill of SKILLS | filter:'skillGruppe':filterWert">
<div class="skill">
<mat-accordion>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title>{{ skill.skillname }} </mat-panel-title>
<mat-progress-bar
class="progress-bar"
[value]="skill.skillwert"
[color]="'accent'"
[mode]="'buffer'"
></mat-progress-bar>
<mat-panel-description> </mat-panel-description>
</mat-expansion-panel-header>
<div>{{ skill.skillBeschreibung }}</div>
</mat-expansion-panel>
</mat-accordion>
</div>
</div>
</div>
<ng-template #noItem>
<app-data-loader></app-data-loader>
</ng-template>
</mat-drawer-content>
</mat-drawer-container>
当我使用 id 过滤器单击 div 时,我更改了变量 filterWert 的值。然后我用这个值过滤我的 ngFor。奇怪的是,它工作了一段时间,但现在不再工作了,我只是不明白为什么。当我调试它时,我得到了从管道返回的值,但 ngFor 不会显示它们。我的错误在哪里?
尝试将您的键值对(过滤器的参数)作为对象传递。
然后你可以使用类似这样的东西
export class FilterPipe implements PipeTransform {
transform<T>(items: T[], filter: {key: string, value: any}): T[] {
if (!items || !filter) {
return items;
}
return items.filter(item => item[filter['key']] == filter['value']);
}
}
您正在尝试在 *ngFor
指令中对集合进行操作,以便过滤您的集合而不是循环遍历它。
关于管道的 angular 文档附录指定不对通过管道的 *ngFor
指令使用 filter
或 order
操作。 (https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe)
您可以做的是在将数据绑定到 *ngFor
指令之前过滤数据。例如:
component.ts
public ngOnInit(): void {
requestCollectionFromApi().subscribe(result => {
skillGruppen = filter(result, 'skillGruppe');
});
}
private filter(result: Array, unique: string): Array {
// Process filter operation here and return new array with filtered data.
}
然后在您的 HTML 中移除管道:
<div *ngFor="let skillGruppe of skillGruppen">
<button mat-button class="filter">
<div (click)="filtereSkills(filter.textContent)" #filter>
{{ skillGruppe.skillGruppe }}
</div>
</button>
</div>
希望对您有所帮助。
我有一个管道,它只用完全匹配的方式过滤我的 ngFor,我通过点击过滤参数来过滤它。
这是我的烟斗:
transform(werte: any[], kriterium: string, gruppe): any[] {
if (!werte) {
return [];
}
if (!gruppe || gruppe.length === 0) {
return werte;
}
return werte.filter(it =>
it[kriterium] === gruppe);
}
这是我的 HTML:
<mat-drawer-container class="example-container">
<mat-drawer mode="side" opened class="side-nav">
<!-- <mat-card class="mat-card">Kategorien:</mat-card> -->
<div *ngFor="let skillGruppe of skillGruppen | unique:'skillGruppe'">
<button mat-button class="filter">
<div (click)="filtereSkills(filter.textContent)" #filter>
{{ skillGruppe.skillGruppe }}
</div>
</button>
</div>
</mat-drawer>
<mat-drawer-content>
<div *ngIf="SKILLS?.length > 0; else noItem">
<div *ngFor="let skill of SKILLS | filter:'skillGruppe':filterWert">
<div class="skill">
<mat-accordion>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title>{{ skill.skillname }} </mat-panel-title>
<mat-progress-bar
class="progress-bar"
[value]="skill.skillwert"
[color]="'accent'"
[mode]="'buffer'"
></mat-progress-bar>
<mat-panel-description> </mat-panel-description>
</mat-expansion-panel-header>
<div>{{ skill.skillBeschreibung }}</div>
</mat-expansion-panel>
</mat-accordion>
</div>
</div>
</div>
<ng-template #noItem>
<app-data-loader></app-data-loader>
</ng-template>
</mat-drawer-content>
</mat-drawer-container>
当我使用 id 过滤器单击 div 时,我更改了变量 filterWert 的值。然后我用这个值过滤我的 ngFor。奇怪的是,它工作了一段时间,但现在不再工作了,我只是不明白为什么。当我调试它时,我得到了从管道返回的值,但 ngFor 不会显示它们。我的错误在哪里?
尝试将您的键值对(过滤器的参数)作为对象传递。
然后你可以使用类似这样的东西
export class FilterPipe implements PipeTransform {
transform<T>(items: T[], filter: {key: string, value: any}): T[] {
if (!items || !filter) {
return items;
}
return items.filter(item => item[filter['key']] == filter['value']);
}
}
您正在尝试在 *ngFor
指令中对集合进行操作,以便过滤您的集合而不是循环遍历它。
关于管道的 angular 文档附录指定不对通过管道的 *ngFor
指令使用 filter
或 order
操作。 (https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe)
您可以做的是在将数据绑定到 *ngFor
指令之前过滤数据。例如:
component.ts
public ngOnInit(): void {
requestCollectionFromApi().subscribe(result => {
skillGruppen = filter(result, 'skillGruppe');
});
}
private filter(result: Array, unique: string): Array {
// Process filter operation here and return new array with filtered data.
}
然后在您的 HTML 中移除管道:
<div *ngFor="let skillGruppe of skillGruppen">
<button mat-button class="filter">
<div (click)="filtereSkills(filter.textContent)" #filter>
{{ skillGruppe.skillGruppe }}
</div>
</button>
</div>
希望对您有所帮助。