角4管过滤器

use*_*602 27 angular-pipe angular

我正在尝试使用自定义管道*ngFor使用带有ngModel的输入字段来过滤我的循环.使用我的其他自定义管道(sortBy),它工作得很好.但是,过滤管似乎使得没有数据出现.我还在学习这个,我尝试了一些变化无济于事:

-filter: term
-filter: {{term}}
-filter: 'term'
-filter" {{'term'}}
Run Code Online (Sandbox Code Playgroud)

所以我认为问题可能在于代码中的其他地方.如果有人可以提供帮助,我会非常感激.

这是我的代码:

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>
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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 { }
Run Code Online (Sandbox Code Playgroud)

JS组件

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";
}
Run Code Online (Sandbox Code Playgroud)

LLa*_*Lai 22

这是一个带有过滤器和sortBy管道的工作plunkr.https://plnkr.co/edit/vRvnNUULmBpkbLUYk4uw?p=preview

正如注释中提到的developer033,当过滤器管道期望一组值时,您将一个值传递给过滤器管道.我会告诉管道期望单个值而不是数组

export class FilterPipe implements PipeTransform {
    transform(items: any[], term: string): any {
        // I am unsure what id is here. did you mean title?
        return items.filter(item => item.id.indexOf(term) !== -1);
    }
}
Run Code Online (Sandbox Code Playgroud)

我同意DeborahK的观点,即出于性能原因应避免使用不纯的管道.plunkr包含控制台日志,您可以在其中查看不纯管道的调用量.

  • @ user3523602我会按照这个https://plnkr.co/edit/cAfZdqU2ZqTkLcOoIaWW?p=preview的方式做一些事情.这会将过滤放在一个可观察的序列之后,这样你就可以更好地控制过滤流程(debounce + distinctUntilChanged) (3认同)

Deb*_*ahK 12

变换方法签名在Angular 2的RC中某处发生了变化.尝试更像这样的东西:

export class FilterPipe implements PipeTransform {
    transform(items: any[], filterBy: string): any {
        return items.filter(item => item.id.indexOf(filterBy) !== -1);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想处理空值并使过滤器不敏感,你可能想要做一些更像我在这里的事情:

export class ProductFilterPipe implements PipeTransform {

    transform(value: IProduct[], filterBy: string): IProduct[] {
        filterBy = filterBy ? filterBy.toLocaleLowerCase() : null;
        return filterBy ? value.filter((product: IProduct) =>
            product.productName.toLocaleLowerCase().indexOf(filterBy) !== -1) : value;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:管道中的排序和过滤是性能的一个大问题,建议使用它们.有关详细信息,请参阅此处的文档:https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe

  • 我提供的链接涵盖了这一点:“ Angular团队和许多经验丰富的Angular开发人员强烈建议将过滤和排序逻辑移入组件本身。该组件可以公开filterHeroes或sortedHeroes属性,并控制执行支持逻辑的时间和频率您可以放入管道并在应用程序之间共享的任何功能都可以写入过滤/排序服务中,然后注入到组件中。” (2认同)