2016-07-31 3 views
0

J'ai plusieurs tuyaux différents que je voudrais activer et désactiver si l'utilisateur veut filtrer leurs données par des critères différents. Comment activer/désactiver les tuyaux actuellement utilisés dans une recherche ou construire un seul tuyau qui se comporte différemment en fonction des boutons sur lesquels l'utilisateur a cliqué?Angular 2, construire dynamiquement un tuyau personnalisé en fonction des préférences de l'utilisateur

Par exemple, deux tuyaux/filtres ressembleraient cette ...

//cloud.pipe.ts 
import {Pipe} from '@angular/core'; 
import {Hero} from './hero'; 

@Pipe({ 
    name: 'Cloud' 
}) 
export class CloudPipe{ 
    transform(value) { 
    if (value == null) { 
     return null; 
    } 
    return value.filter(hero => { 
     return hero.cloud === true; 
    }); 
    } 
} 
//location.pipe.ts 
import {Pipe} from '@angular/core'; 
import {Hero} from './hero'; 
import { HeroService } from './hero.service'; 
import { HeroesComponent } from './heroes.component'; 

@Pipe({ 
    name: 'Location' 
}) 

export class LocationPipe{ 
    transform(value) { 
    if (value == null) { 
     return null; 
    } 
    return value.filter(hero => { 
     return hero.location < 500; 
    }); 
    } 
} 

Alors je voudrais que l'utilisateur bascule différents boutons de filtre et ajouter/supprimer des tuyaux à la liste. Quelle est la meilleure approche pour quelque chose comme ça? Je préférerais ne pas avoir tout dans le même tuyau que je voudrais prolonger chaque tuyau pour en faire plus dans le futur. Chaque tuyau doit donc être "propre" et fonctionner indépendamment l'un de l'autre, mais en même temps, il doit fonctionner avec d'autres tuyaux si nécessaire.

Répondre

0

On peut créer un tuyau d'enveloppe qui transfère à d'autres tubes en fonction des paramètres à utiliser comme

<div *ngFor="let hero of heroes | myPipe:'Cloud':'Location'" ></div> 
@Pipe({ 
    name: 'myPipe' 
}) 
export class MyPipe{ 
    locationPipe = new LocationPipe(); 
    cloudPipe = new CloudPipe(); 
    constructor() { 
    pipes = { 
     locationPipe: this.locationPipe, 
     cloudPipe: this.clouldPipe 
    }; 
    } 

    transform(value, param1, param2) { 
    var result = value; 
    if(pram1) { 
     result = this.pipes[param1].transform(result); 
    } 
    if(pram2) { 
     result = this.pipes[param1].transform(result); 
    } 
    } 
} 

ou si la liste des tuyaux est utilisé en tant que matrice comme

<div *ngFor="let hero of heroes | myPipe:['Cloud':'Location']" ></div> 
@Pipe({ 
    name: 'myPipe' 
}) 
export class MyPipe{ 
    locationPipe = new LocationPipe(); 
    cloudPipe = new CloudPipe(); 
    constructor() { 
    pipes = { 
     locationPipe: this.locationPipe, 
     cloudPipe: this.clouldPipe 
    }; 
    } 

    transform(value, params) { 
    var result = value; 
    for(var p in params) { 
     result = this.pipes[p].transform(result); 
    } 
    } 
} 
+0

Merci pour la réponse rapide, e est prometteur. Je vais vérifier plus tard si je peux le faire fonctionner! –

+0

Dans votre exemple, LocationPipe est-il le seul canal que vous exportez? (Pourquoi LocationPipe est-il le wrapper de "lui-même" et de cloudPipe?) Et dans ce scénario, qu'est-ce que le nouveau LocationPipe(); faire référence à? Est-ce implicite que les deux tuyaux (LocationPipe, CloudPipe) sont importés à partir de fichiers séparés (comme dans mon exemple) et utilisés pour exporter à nouveau un nouveau LocationPipe? Désolé mais je ne suis pas vraiment ce qui se passe. Aussi, j'obtiens une erreur: La propriété 'pipes' n'existe pas sur le type 'LocationPipe' dans mon compilateur dactylographié. J'espère que je ne manque pas quelque chose d'évident, pourriez-vous expliquer un peu plus ce qui se passe dans votre exemple? –

+0

Désolé, j'ai oublié de renommer. J'ai mis à jour ma réponse. Les 'LocationPipe' et' CloudPipe' ne sont en fait pas utilisés comme des tuyaux mais juste appelés directement. Ils pourraient également être injectés en utilisant le constructeur à la place. –