308 votes

Comment déclarer une variable dans un template en Angular

J'ai le modèle suivant :

  {{aVariable}}

et je voudrais obtenir :

  {{a}}

Y a-t-il un moyen de le faire ?

0 votes

Je suis intéressé de savoir quelles sont les exigences/cas d'utilisation pour vouloir modifier le nom d'un paramètre de liaison comme dans cet exemple?

43 votes

C'est juste pour éviter de répéter quelque chose comme tab[element].val par exemple. Je sais que je peux résoudre le problème dans le composant, mais je cherchais juste comment le faire dans le modèle (même si je ne finis peut-être pas avec cette solution).

3 votes

@LDJ un cas d'utilisation sample : l'efficacité. Utilisez l'exemple de stackblitz.com/angular/… {{node.item}} En fait, descendantsPartiallySelected() appelle descendantsAllSelected(). Cela signifie que parfois descendantsAllSelected est appelé deux fois. S'il y a une variable locale, cela peut être évité.

284voto

yurzui Points 85802

Mise à jour

Nous pouvons simplement créer une directive comme *ngIf et l'appeler *ngVar

ng-var.directive.ts

@Directive({
    selector: '[ngVar]',
})
export class VarDirective {
    @Input()
    set ngVar(context: unknown) {
        this.context.$implicit = this.context.ngVar = context;

        if (!this.hasView) {
            this.vcRef.createEmbeddedView(this.templateRef, this.context);
            this.hasView = true;
        }
    }

    private context: {
        $implicit: unknown;
        ngVar: unknown;
    } = {
        $implicit: null,
        ngVar: null,
    };

    private hasView: boolean = false;

    constructor(
        private templateRef: TemplateRef,
        private vcRef: ViewContainerRef
    ) {}
}

Avec cette directive *ngVar nous pouvons utiliser ce qui suit

      {{variable | json}}

ou

    {{variable | json}}

ou

    {{variable | json}}

ou

    {{variable | json}}

Exemple Plunker Angular4 ngVar

Voir aussi

Réponse originale

Angular v4

  1. div + ngIf + let

    {{variable.a}} {{variable.b}}

  2. div + ngIf + as

vue

  {{variable.a}}
  {{variable.b}}
  {{variable.c}}

component.ts

export class AppComponent {
  x = 5;
}
  1. Si vous ne voulez pas créer de wrapper comme div vous pouvez utiliser ng-container

vue

  {{variable.a}}
  {{variable.b}}
  {{variable.c}}

Comme @Keith l'a mentionné dans les commentaires

Cela fonctionnera dans la plupart des cas mais ce n'est pas une solution générale car elle repose sur la vérité de la variable

Voir la mise à jour pour une autre approche.

15 votes

Cela fonctionnera dans la plupart des cas, mais ce n'est pas une solution générale car cela repose sur variable étant truthy

7 votes

@Keith Merci d'avoir signalé cela. Vous pouvez consulter ma réponse mise à jour.

4 votes

Voici la nouvelle réponse car elle 1) est plus moderne que l'autre solution 2) résume les pull requests liés dans la réponse actuelle et permet de gagner beaucoup de temps 3) inclut les exemples en ligne plutôt que par lien externe. Merci de l'avoir montré. Autant que je sache, tout objet enveloppé dans {} évaluera à true, donc cette solution est assez robuste.

113voto

Steven Liekens Points 2327

Vous pouvez déclarer des variables dans le code html en utilisant un élément template dans Angular 2 ou ng-template dans Angular 4+.

Les modèles ont un objet de contexte dont les propriétés peuvent être assignées à des variables en utilisant la syntaxe de liaison let. Notez que vous devez spécifier une sortie pour le modèle, mais cela peut être une référence à lui-même.

    {{a}}

Vous pouvez réduire la quantité de code en utilisant la propriété $implicit de l'objet de contexte au lieu d'une propriété personnalisée.

    {{a}}

L'objet de contexte peut être un objet littéral ou toute autre expression de liaison. Autres exemples valides:

0 votes

Pour le faire fonctionner, j'ai dû changer votre code de '

2 votes

Oui, vous pouvez seulement utiliser

0 votes

Quel est le t pour?

101voto

kayjtea Points 1266

Laide, mais:

  {{a}}

Lorsqu'il est utilisé avec le tuyau async:

  {{a.prop1}}
  {{a.prop2}}

4 votes

C'est celui auquel j'ai instinctivement pensé - il fonctionne avec *ngFor="let a of [(someStream$ | async).someA] aussi. Je suppose qu'utilisé avec un , cela fait très bien l'affaire!

6 votes

En cas de *ngFor, gardez à l'esprit que tout le contenu imbriqué sera recréé si la valeur de la variable change, jusqu'à ce que vous spécifiez une fonction trackBy qui renvoie le même identifiant pour toutes les valeurs.

1 votes

Excellent, enfin un moyen de réutiliser le même Component expression! Si vous n'avez pas vraiment besoin du

et que vous souhaitez simplement réutiliser un membre/propriété d'un Component, utilisez un ng-container, par exemple -

61voto

Günter Zöchbauer Points 21340

mise à jour 3

Le problème https://github.com/angular/angular/issues/2451 est corrigé dans Angular 4.0.0

Voir aussi

mise à jour 2

Ceci n'est pas pris en charge.

Il existe des variables de modèle mais il n'est pas possible d'assigner des valeurs arbitraires. Elles ne peuvent être utilisées que pour faire référence aux éléments auxquels elles sont appliquées, aux noms exportés des directives ou des composants et aux variables de portée pour les directives structurelles comme ngFor,

Voir aussi https://github.com/angular/angular/issues/2451

Mise à jour 1

@Directive({
  selector: '[var]',
  exportAs: 'var'
})
class VarDirective {
  @Input() var:any;
}

et l'initialiser comme ceci

ou

et utiliser la variable comme ceci

{{aVariable.var}}

(non testé)

  • #aVariable crée une référence à la VarDirective (exportAs: 'var')
  • var="abc" instancie la VarDirective et passe la valeur de chaîne "abc" à son entrée de valeur.
  • aVariable.var lit la valeur assignée à l'entrée var de la directive var.

0 votes

Ne serait-il pas possible de créer une directive structurale pour le faire?

0 votes

Si vous avez besoin de cela de manière répétée, une directive pourrait faire ce que vous voulez. Une directive structurelle crée sa propre vue, ce n'est probablement pas ce que vous voulez.

1 votes

@GünterZöchbauer, très bon travail. Je sais que c'est probablement une meilleure pratique d'avoir des variables calculées/préparées dans le fichier component.ts. Mais c'est tellement plus facile pour moi de les avoir dans la vue pour certains cas en raison d'un schéma de synchronisation que j'implémente dans toute mon application. Je profite des règles de référence JavaScript lorsque différentes variables pointent vers le même objet.

12voto

Aaron Points 151

Voici une directive que j'ai écrite qui étend l'utilisation du paramètre de décoration exportAs, et vous permet d'utiliser un dictionnaire comme variable locale.

import { Directive, Input } from "@angular/core";
@Directive({
    selector:"[localVariables]",
    exportAs:"localVariables"
})
export class LocalVariables {
    @Input("localVariables") set localVariables( struct: any ) {
        if ( typeof struct === "object" ) {
            for( var variableName in struct ) {
                this[variableName] = struct[variableName];
            }
        }
    }
    constructor( ) {
    }
}

Vous pouvez l'utiliser comme suit dans un modèle:

   a = {{local.a}}
   b = {{local.b}}
   c = {{local.c}}

Bien sûr, #local peut être n'importe quel nom de variable locale valide.

0 votes

Ne passe pas en 'production' tel quel (apparaît également comme des erreurs par les IDE). Ajoutez [clé: string]: any; à la Classe pour contourner cela.

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