103 votes

Angulaire 2 Tuyau sous condition

Est-il possible dans Angular 2 d'appliquer un tuyau sous condition ? Je voudrais faire quelque chose comme :

{{ variable.text | (variable.value ? SomePipe : OtherPipe) }}

Si ce n'est pas le cas, quelle est la meilleure façon d'obtenir cet effet ?

0 votes

Je pense que ça devrait marcher. Avez-vous essayé ?

1 votes

Oui, cela provoque des erreurs d'analyse des modèles.

221voto

Günter Zöchbauer Points 21340

Vous devez changer un peu la syntaxe :

{{variable.value ? (variable.text | SomePipe) : (variable.text | pipe2)}}

Exemple de Plunker

0 votes

Puis-je utiliser ceci à l'intérieur de ngFor ? ex : <div *ngFor="let item of data | slice:0:20"> . J'ai besoin d'appliquer le filtre uniquement dans certains cas.

1 votes

Bien sûr, peut être utilisé dans *ngFor également.

6 votes

Merci @GünterZöchbauer *ngFor="let a of (condition ? (arr | pipe) : (arr | pipe2))"

10voto

ajorquera Points 47

Vous pouvez également utiliser ngIf

<span *ngIf="variable.value; else elseBlock">{{ variable.text | SomePipe }}</span>
<ng-template #elseBlock>{{ variable.text | OtherPipe }}</ng-template>

Je le trouve utile au cas où la file d'attente deviendrait trop longue.

8voto

bvdb Points 898

Comme d'autres l'ont fait remarquer, vous pouvez utiliser la syntaxe de {{condition ? (value | pipe1) : (value2 | pipe2 )}} .

Mais il est bon de savoir que le paramètre de format d'un tube peut également être dynamique. Par exemple, voici un exemple de nombre qui peut être formaté avec une précision élevée ou faible. La condition est passée à une méthode, qui va créer un texte de formatage de manière conditionnelle.

  // in template
  {{ value | number:getFormat(true) }}

  // in .ts
  public getFormat(highPrecision = false): string {
    const digits = highPrecision ? 3 : 2;
    return `1.${digits}-${digits}`;
  }

Donc, oui, vous pouvez utiliser une condition pour choisir entre deux tubes. Mais dans certains cas, vous pouvez préférer (ou n'avoir besoin) d'utiliser qu'un seul tube avec un paramètre de format conditionnel. .

6voto

thierry templier Points 998

Comme cette syntaxe n'est pas prise en charge, je pense que la seule façon de procéder est d'implémenter un autre tube pour gérer la condition :

@Pipe({
  name: 'condition'
})
export class ConditionPipe {
  transform(val,conditions) {
    let condition = conditions[0];
    let conditionValue = conditions[1];

    if (condition===conditionValue) {
      return new Pipe1().transform(val);
    } else {
      return new Pipe2().transform(val);
    }
  }
}

Et utilise-le de cette façon :

@Component({
  selector: 'app'
  template: `
    <div>
      {{val | condition:cond:1}}<br/>
    </div>
  `,
  pipes: [ Pipe1, Pipe2, ConditionPipe ]
})
export class App {
  val:string = 'test';
  cond:number = 1;
}

Voir ce plunkr : https://plnkr.co/edit/KPIA5ly515xZk4QZx4lp?p=preview .

3 votes

Il s'agit plutôt d'une solution de contournement que d'une solution réelle dans ce cas, mais elle peut être utile pour des cas plus complexes, +1

0 votes

Oui, vous avez raison ! La solution de Günter est meilleure pour les cas d'utilisation simples ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X