2016-04-06 1 views
1

Comment utiliser deux tubes séquentiellement?2 tubes séquentiels angulaires

<div class="thread" *ngFor="thread of threadlist | bookmarkPipe | threadPipe"></div> 

Dans mes discussions spécifiques ont un signet: propriété booléenne ainsi que des propriétés d'étiquette (unité, tâche, sous-tâche). donc ce que je veux réaliser est que le premier tube filtre tous les fils qui sont favoris, puis appliquer le 2ème tube (ci-dessous)

export class ThreadPipe implements PipeTransform{ 

    transform(array:Thread[], [unit,task,subtask]):any{ 

    //See all Threads 
    if(unit == 0 && task == 0 && subtask == 0){ 
     return array 
    } 
    //See selected Units only 
    if(unit != 0 && task == 0 && subtask == 0){ 
     return array.filter(thread => { 
     return thread.unit === unit; 
     }); 
    } 
    //See selected Units and Tasks 
    if (unit != 0 && task != 0 && subtask == 0){ 
     return array.filter(thread => { 
     return thread.unit === unit && thread.task === task; 
     }); 
    } 
    // See selected units, tasks, subtask 
    if (unit != 0 && task != 0 && subtask != 0){ 
     return array.filter(thread => { 
     return thread.unit === unit && thread.task === task && thread.subtask === subtask; 
     }); 
    } 
    } 
} 

Répondre

2

En fait, il n'y a rien à faire de particulier. Le second tuyau recevra la valeur de la précédente:

data -> Pipe1 -> filtered data (#1) -> Pipe2 -> filtered data (#2) 

Par exemple, si j'ai un tableau [ 'val1', 'val2', 'val3' ] et avec les tuyaux suivants:

@Pipe({ 
    name:'pipe1' 
}) 
export class Pipe1 { 
    transform(data) { 
    return data.filter((d) => { 
     return d!= 'val1'; 
    }); 
    } 
} 

@Pipe({ 
    name:'pipe2' 
}) 
export class Pipe2 { 
    transform(data) { 
    return data.filter((d) => { 
     return d!= 'val2'; 
    }); 
    } 
} 

En utilisant l'expression suivante dans une ngFor:

#elt of data | pipe1 | pipe2 

data | pipe1 retournera [ 'val2', 'val3' ] et retour [ 'val3' ] si l'on applique le pipe2 sur le résultat précédent.

Voir le plunkr correspondant: https://plnkr.co/edit/EpKMitR3w89fRiyGYQz7?p=preview.

+0

Salut merci pour la réponse rapide, donc fondamentalement # de données | pipe1 | pipe2 | pipe3 signifierait quelque chose comme ça? ((#elt de données | pipe1) | pipe2) | pipe 3 –

+0

Aussi, je viens de lire sur angular.io qu'il est encouragé à faire la liste de filtrage avec des tuyaux et que cela devrait être fait à l'intérieur du composant. Cependant je pense que dans ce cas où les utilisateurs ne cliquent qu'une fois sur le filtre et que le tuyau n'est appelé qu'une seule fois, ça devrait aller? –

+0

Je pense que c'est la bonne approche ici. Quand vous avez des pipes "non pures" (stateful), c'est un peu différent puisque le pipe est appelé à chaque fois que les bindings sont mises à jour. Voir la réponse génial de ce Mark Rajcok pour plus de détails: http://stackoverflow.com/questions/34456430/ngfor-doesnt-update-data-with-pipe-in-angular2/34497504. Je serais intéressé par le lien sur le site angular.io ;-) –