J'ai le modèle suivant :
{{aVariable}}
et je voudrais obtenir :
{{a}}
Y a-t-il un moyen de le faire ?
J'ai le modèle suivant :
{{aVariable}}
et je voudrais obtenir :
{{a}}
Y a-t-il un moyen de le faire ?
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
Angular v4
div
+ ngIf
+ let
{{variable.a}} {{variable.b}}
div
+ ngIf
+ as
vue
{{variable.a}}
{{variable.b}}
{{variable.c}}
component.ts
export class AppComponent {
x = 5;
}
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.
Cela fonctionnera dans la plupart des cas, mais ce n'est pas une solution générale car cela repose sur variable
étant truthy
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.
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:
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!
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.
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 -
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
.
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.
@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.
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.
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.
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é.
4 votes
`
{{user1|json}} {{user|json}}
`
0 votes
@dasfdsa Je crois que
user1 === user
, donc vous devez soit faire*ngIf="{name:'john'} as user1
ou*ngIf="{name:'john'};let user
comme dans la réponse de yurzui.0 votes
Veuillez vous référer à ce stackoverflow.com/questions/55726995/angular-6-alias-on-html/…
0 votes
Pour les règles de modèle de localisation i18n, consultez ici sur SO
0 votes
Un cas d'utilisation courant consistera à récupérer une valeur à partir d'un observable sans avoir à se préoccuper de se désabonner du code du composant: