Angulaire 4 Tuyau De Filtre
Je suis en train d'utiliser un tuyau de filtre de mon *ngFor
boucle à l'aide d'un champ de saisie avec ngModel. Avec mon autre coutume pipe (sortBy), il fonctionne parfaitement bien. Cependant, le filtre de la pipe semble faire ce qu'aucune des données s'affiche. Je suis encore à apprendre cela, et j'ai essayé un peu de variations en vain:
-filter: term
-filter: {{term}}
-filter: 'term'
-filter" {{'term'}}
Donc je pense que le problème réside peut-être ailleurs dans le code. Si quelqu'un peut aider, j'apprécierais vraiment.
Voici mon code:
Composant HTML
<div style="text-align:center">
<h1>
Welcome to {{title}}!!
</h1>
</div>
<h2>Please choose your favorite song: </h2>
<form id="filter">
<label>Filter people by name:</label>
<input type="text" name="term" [(ngModel)]="term" />
</form>
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Artist</th>
<th>Likes</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let song of songs | filter:term| sortBy: 'likes'; let i = index">
<td>{{song.title}}</td>
<td>{{song.artist}}</td>
<td>{{song.likes}}
<i class="fa fa-heart-o" aria-hidden="true" *ngIf="song.likes < 1"></i>
<i class="fa fa-heart" aria-hidden="true" *ngIf="song.likes >= 1"></i>
<i class="fa fa-plus" aria-hidden="true" (click)="addLike(i)" ></i>
<i class="fa fa-minus" aria-hidden="true" (click)="removeLike(i)" ></i>
</td>
</tr>
</tbody>
</table>
PIPE
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filter',
pure: false
})
export class FilterPipe implements PipeTransform {
transform(items: any[], args: any[]): any {
return items.filter(item => item.id.indexOf(args[0]) !== -1);
}
}
Module
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { SortByPipe } from './sort-by.pipe';
import { FilterPipe } from './filter.pipe';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { Pipe, PipeTransform } from '@angular/core';
@NgModule({
declarations: [
AppComponent,
SortByPipe,
FilterPipe
],
imports: [
BrowserModule,
FormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
JS COMPOSANT
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
title = 'Oxcord';
songs = [
{title: "Song", artist: "Artist", likes: 1},
{title: "Chanson", artist: "Artiste", likes: 3},
{title: "ABC", artist: "OneTwoThree", likes: 2},
{title: "Trash", artist: "Meek Mill", likes: 0}
];
addLike(input){
this.songs[input].likes +=1;
}
removeLike(input){
this.songs[input].likes -=1;
}
args="Me";
}
Vous êtes de passage à une seule variable
array
comme paramètre à votre filter
Pipe, mais là, vous attendez un array
.OriginalL'auteur user3523602 | 2017-06-26
Vous devez vous connecter pour publier un commentaire.
Ici est un travail plunkr avec un filtre et sortBy pipe. https://plnkr.co/edit/vRvnNUULmBpkbLUYk4uw?p=preview
Comme developer033 mentionné dans un commentaire, vous êtes de passage pour une seule valeur pour le filtre tuyau, lorsque le filtre de la pipe est en attente d'une matrice de valeurs. Je voudrais dire à la pipe de s'attendre à une valeur unique au lieu d'un tableau
Je suis d'accord avec DeborahK que impure tuyaux doivent être évités pour des raisons de performances. Le plunkr inclut des journaux de la console où vous pouvez voir comment beaucoup de l'impur, la pipe est appelé.
Je voudrais faire quelque chose le long des lignes de ce plnkr.co/modifier/cAfZdqU2ZqTkLcOoIaWW?p=preview Cela met le filtrage derrière une observable de la séquence, de sorte que vous pouvez contrôler le flux de filtrage mieux (anti-rebond + distinctUntilChanged)
pouvez-vous me dire comment créer un filtre de colonne particulière
OriginalL'auteur LLai
La méthode de transformation de modification de la signature de quelque part dans un RC Angulaire 2. Essayez quelque chose comme ceci:
Et si vous souhaitez gérer les valeurs null et rendre le filtre insensibles à la casse, vous voudrez peut-être faire quelque chose de plus comme celui que j'ai ici:
Et NOTE: Tri et de filtrage dans les tuyaux est un gros problème avec les performances et ils sont PAS recommandé. Voir la doc pour plus d'info: https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
transform(items: any[], args: any[]): any { ... }
, mais, bien sûr, si vous faites cela, vous avez à passer des paramètres à l'intérieur dearray
, comme ceci:<div *ngFor="let song of songs | filter: [term]"...
C'est à partir de la variation de log ", pipes prendre un nombre variable d'arguments, et non pas un tableau qui contient tous les arguments." à partir de la version 2.0.0-bêta.16 sur ce lien: github.com/angular/angular/blob/master/CHANGELOG.md Mais oui, si vous passez un tableau puis l'argument est un tableau.
Merci!!!! J'ai utilisé le code par LLai, mais ajouté un peu de la vôtre pour le rendre insensible à la casse et il fonctionne très bien. Depuis le tri est fitlering à l'aide de tuyaux est un problème, pourriez-vous expliquer mieux que j'ai pu rendre cette fonctionnalité fonctionne?
Le lien que j'ai fourni couverts ceci: "L'Angulaire de l'équipe et de nombreux expérimenté Angulaire développeurs vous recommandons fortement de déplacement de tri et de filtrage logique dans le composant lui-même. Le composant peut exposer un filteredHeroes ou sortedHeroes de la propriété et de prendre le contrôle sur le moment et la fréquence d'exécution de la logique. Toutes les fonctionnalités qui vous aurait mis dans un tuyau et partagée au sein de l'application peut être écrit dans un de filtrage/service de triage et injecté dans le composant."
OriginalL'auteur DeborahK