2017-02-09 1 views
1

je l'objet JSON suivant: http://pastebin.com/1TguvZXcComment utiliser des tuyaux personnalisés Angular2

Voici mes modèles de composants HTML:

<button *ngFor="let category of categories" (click)="chooseCategory(this.category)" type="button" name="button" class="btn btn-default" id="{{category}}"> 
    {{category}} 
</button> 
<div *ngFor="let model of models?.models"> 
    <div *ngFor="let year of model['years']"> 
    <div *ngFor="let style of year['styles'] | chooseCategory"> 
     {{model.name}}, {{style.submodel.body }} 
    </div> 
</div> 

A (pipe?) Méthode de mon models.component :

chooseCategory(selectedCategory: string): void { 
    if((selectedCategory === '')) { 
     this.filterByPipe.transform(this.models, 
        ['models.years.styles.submodel.body'], selectedCategory); 
    } 
} 

de plus, je voudrais utiliser le pépin FilterByPipe e de ngx-pipes pour filtrer par catégorie dans models.years.styles.submodel.body.

Le code HTML de mon roduces l'erreur suivante:

Unhandled Promise rejection: Template parse errors: 
The pipe 'chooseCategory' could not be found ("or="let model of models?.models"> 
    <div *ngFor="let year of model['years']"> 
    <div *ngFor="let s[ERROR ->]tyle of year['styles'] | chooseCategory"> 
     {{model.name}}, {{style.submodel.body }} 
+0

J'ai décrit clairement comment créer des tuyaux personnalisés ici: http: // stackoverflow .com/a/42094880/6695924 –

+0

@Kinduser, pour développer votre post (que j'ai vu et upvoted) - J'apprécierais une compréhension sur la façon de mettre en œuvre ce tuyau grâce à une fonction (clic) des boutons – Moshe

+1

Vous voulez que le tuyau exécuter sur le bouton cliquer? Ou je ne vous ai pas bien compris? –

Répondre

1

Je pense que vous ne lisez même la documentation. Yu devrait créer tuyau de cette façon:

@Pipe({ 
    name: 'somePipe' 
}) 
export class SomePipe { 

    transform(value: any[]): any[] { 
     //some transform code... 
    } 
} 

et peut vous appeler dans le fichier HTML de cette façon:

<div *ngFor="let elem of elements | somePipe"></div> 

Ne pas oublier de déclarer votre tuyau dans le module.

@NgModule({ 
    declarations: [ SomePipe ] 
}) 

C'est ce que vous utilisez est une méthode, pas un tuyau.

Si vous voulez tuyau exécuter dépendez (fe) bouton clic, vous devez construire pipe avec l'argument:

@Pipe({ 
     name: 'somePipe' 
    }) 
    export class SomePipe { 
     transform(value: any[], args: any[]): any[] { 
     let someFlag: boolean = false; 
     if(args && args[0]) someflag = true; 
     if(someflag) { 
      //some transform code... 
     } 
     } 
    } 

pour appeler cette conduite de cette manière

<div *ngFor="let elem of elements | somePipe : yesOrNo"></div> 

et pouvez-vous utiliser dans la méthode de votre composant pour cliquer sur le bouton

yesOrNo: boolean = false; 

onClickButton(event: any) { 
    event.preventDefault(); 
    yesOrNo = !yesOrNo; 
} 
+0

Ceci est très utile, mais pas tout à fait ce que je cherche. – Moshe

+0

Je ne suis pas sûr de comprendre le concept de tuyau. Vous pouvez utiliser le symbole de pipe "|" dans votre code HTML de la façon que je vous ai présenté. Ou vous pouvez appeler la méthode _transform_ dans votre fichier TypeScript. Mais vous ne pouvez pas utiliser le symbole de pipe sur n'importe quelle méthode –

+0

je modifie mon message pour expliquer comment pouvez-vous utiliser des arguments dans le tuyau –

1

Depuis que vous importez la pipe et de l'appeler d'un bouton dans votre component, vous n'avez pas besoin d'appeler le tuyau directement dans votre component. En outre, chooseCategory est juste un method, pas un pipe. Ensuite, retirez le pipe de la ligne suivante:

<div *ngFor="let style of year['styles'] | chooseCategory"> 
+0

Comment puis-je faire cela dans un tuyau? J'en ai besoin pour filtrer par catégories w/boutons – Moshe

+0

Je ne peux pas comprendre ce que vous voulez enfin ^^. Il y a quelques minutes, vous avez demandé à [** this **] (http://stackoverflow.com/q/42140805/4911842) question d'appel 'pipe' à partir d'un bouton, maintenant vous voulez l'inverse .. – developer033

+0

J'ai une réponse JSON c'est afficher tous les objets dans NgFor = "". en utilisant les boutons, je prévois de filtrer les données de ces modèles dans le ngFor = "" pour afficher tous les modèles qui correspondent au sous-modèle.body '(category) – Moshe