Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular2: pass in a property name to a pipe

Tags:

angular

In Angular2, I have a text filter pipe below. Instead of fixing "title", is it possible to pass in the property name which the data are filtered by?

import {Injectable, Pipe,PipeTransform} from 'angular2/core';

@Pipe({
  name: 'textfilter'
})
@Injectable()
export class TextFilterPipe implements PipeTransform {
  transform(items: any[], args: any[]): any {
    return items.filter(item => item.title.indexOf(args[0]) !== -1);
  }
}
like image 230
Hammer Avatar asked Sep 12 '25 08:09

Hammer


2 Answers

Yes, you can use several parameters:

@Pipe({
  name: 'textfilter'
})
export class TextFilterPipe implements PipeTransform {
  transform(items: any[], args: any[]): any {
    var paramName = args[0];
    var paramValue = args[1];
    return items.filter(item => item[paramName].indexOf(paramValue) !== -1);
  }
}

And use it this way:

someArray | textfilter:title:value

Note that you don't need to use the @Injectable decorator with pipes.

like image 190
Thierry Templier Avatar answered Sep 13 '25 21:09

Thierry Templier


RC.x version

@Pipe({
  name: 'textfilter'
})
export class TextFilterPipe implements PipeTransform {
  transform(items: any[], filterProp, filterValue): any {
    return items.filter(item => item.[filterProp].indexOf(filterValue) !== -1);
  }
}

and use it like

{{someValue | textfilter:'title':abcde}}

beta.x version

@Pipe({
  name: 'textfilter'
})
export class TextFilterPipe implements PipeTransform {
  transform(items: any[], args: any[]): any {
    return items.filter(item => item.[args[0]].indexOf(args[1]) !== -1);
  }
}
like image 29
Günter Zöchbauer Avatar answered Sep 13 '25 22:09

Günter Zöchbauer