So di poter chiamare una pipe come questa:
{{ myData | date:'fullDate' }}
Qui la pipe della data accetta solo un argomento. Qual è la sintassi per chiamare una pipe con più parametri, dal modello HTML del componente e direttamente nel codice?
So di poter chiamare una pipe come questa:
{{ myData | date:'fullDate' }}
Qui la pipe della data accetta solo un argomento. Qual è la sintassi per chiamare una pipe con più parametri, dal modello HTML del componente e direttamente nel codice?
Risposte:
Nel modello del componente è possibile utilizzare più argomenti separandoli con due punti:
{{ myData | myPipe: 'arg1':'arg2':'arg3'... }}
Dal tuo codice sarà simile a questo:
new MyPipe().transform(myData, arg1, arg2, arg3)
E nella tua funzione di trasformazione all'interno della tua pipe puoi usare gli argomenti come questo:
export class MyPipe implements PipeTransform {
// specify every argument individually
transform(value: any, arg1: any, arg2: any, arg3: any): any { }
// or use a rest parameter
transform(value: any, ...args: any[]): any { }
}
Beta 16 e precedenti (26-04-2016)
I pipe accettano un array che contiene tutti gli argomenti, quindi è necessario chiamarli in questo modo:
new MyPipe().transform(myData, [arg1, arg2, arg3...])
E la tua funzione di trasformazione sarà simile a questa:
export class MyPipe implements PipeTransform {
transform(value:any, args:any[]):any {
var arg1 = args[0];
var arg2 = args[1];
...
}
}
arg1
e arg2
dove sia facoltativo che tu volessi solo passare arg2
?
undefined
come primo argomento otterrà il suo valore predefinito.
transform(value:any, arg1:any, arg2:any, arg3:any)
usare l'operatore di riposo mi sento meglio penso:transform(value:any, ...args:any[])
Da beta.16 i parametri non vengono più passati come array al transform()
metodo ma come singoli parametri:
{{ myData | date:'fullDate':'arg1':'arg2' }}
export class DatePipe implements PipeTransform {
transform(value:any, arg1:any, arg2:any):any {
...
}
https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta16-2016-04-26
le pipe ora accettano un numero variabile di argomenti e non una matrice che contiene tutti gli argomenti.
arg1
e arg2
dove sia facoltativo che tu volessi solo passare arg2
?
arg1
? Come isFullDate
. Sto solo chiedendo perché ogni esempio usa questo.
'arg1'
e 'arg2'
sono solo letterali stringa passati come parametri aggiuntivi alla pipe. Puoi utilizzare qualsiasi valore o riferimento disponibile in tale ambito (l'istanza del componente corrente)
Uso Pipes in Angular 2+ per filtrare array di oggetti. Quanto segue accetta più argomenti di filtro, ma è possibile inviarne solo uno se soddisfa le proprie esigenze. Ecco un esempio StackBlitz . Troverà le chiavi in base alle quali filtrare, quindi i filtri in base al valore fornito. In realtà è abbastanza semplice, se sembra complicato non lo è, dai un'occhiata all'esempio StackBlitz .
Ecco il Pipe chiamato in una direttiva * ngPer,
<div *ngFor='let item of items | filtermulti: [{title:"mr"},{last:"jacobs"}]' >
Hello {{item.first}} !
</div>
Ecco la pipa,
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filtermulti'
})
export class FiltermultiPipe implements PipeTransform {
transform(myobjects: Array<object>, args?: Array<object>): any {
if (args && Array.isArray(myobjects)) {
// copy all objects of original array into new array of objects
var returnobjects = myobjects;
// args are the compare oprators provided in the *ngFor directive
args.forEach(function (filterobj) {
let filterkey = Object.keys(filterobj)[0];
let filtervalue = filterobj[filterkey];
myobjects.forEach(function (objectToFilter) {
if (objectToFilter[filterkey] != filtervalue && filtervalue != "") {
// object didn't match a filter value so remove it from array via filter
returnobjects = returnobjects.filter(obj => obj !== objectToFilter);
}
})
});
// return new array of objects to *ngFor directive
return returnobjects;
}
}
}
Ed ecco il componente che contiene l'oggetto da filtrare,
import { Component } from '@angular/core';
import { FiltermultiPipe } from './pipes/filtermulti.pipe';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
items = [{ title: "mr", first: "john", last: "jones" }
,{ title: "mr", first: "adrian", last: "jacobs" }
,{ title: "mr", first: "lou", last: "jones" }
,{ title: "ms", first: "linda", last: "hamilton" }
];
}
Esempio GitHub: fork una copia di lavoro di questo esempio qui
*Notare che che in una risposta fornita da Gunter, Gunter afferma che le matrici non vengono più utilizzate come interfacce di filtro, ma ho cercato il link che fornisce e non ho trovato nulla che parla di tale affermazione. Inoltre, l'esempio StackBlitz fornito mostra che questo codice funziona come previsto in Angular 6.1.9. Funzionerà in Angular 2+.
Happy Coding :-)
Esteso da: user3777549
Filtro multi-valore su un set di dati (solo riferimento alla chiave del titolo)
HTML
<div *ngFor='let item of items | filtermulti: [{title:["mr","ms"]},{first:["john"]}]' >
Hello {{item.first}} !
</div>
filterMultiple
args.forEach(function (filterobj) {
console.log(filterobj)
let filterkey = Object.keys(filterobj)[0];
let filtervalue = filterobj[filterkey];
myobjects.forEach(function (objectToFilter) {
if (!filtervalue.some(x=>x==objectToFilter[filterkey]) && filtervalue != "") {
// object didn't match a filter value so remove it from array via filter
returnobjects = returnobjects.filter(obj => obj !== objectToFilter);
}
})
});