137 votes

Impossible d'approcher l'enum Typescript dans le HTML

J'ai créé un enum avec Typescript pour l'utiliser dans MyService.service.ts MyComponent.component.ts et MyComponent.component.html.

export enum ConnectionResult {
    Success,
    Failed     
}

Je peux facilement obtenir et comparer une variable enum définie à partir de MyService.service.ts :

this.result = this.myService.getConnectionResult();

switch(this.result)  
{
    case ConnectionResult.Failed:
         doSomething();
         break;
    case ConnectionResult.Success:
         doSomething();
         break;
}

Je voulais également utiliser l'enum pour une comparaison dans mon HTML en utilisant l'instruction *ngIf :

<div *ngIf="result == ConnectionResult.Success; else failed">
            <img src="../../assets/connection-success.png" height="300px" class="image-sign-style" />
</div>
<ng-template #failed>
       <img src="../../assets/connection-failed.png" height="300px" class="image-sign-style" />
</ng-template>

Le code se compile mais le navigateur me donne une erreur :

Impossible de lire la propriété de l'indéfini

enter image description here

Avec la ligne d'erreur d'indication html suivante :

enter image description here

Quelqu'un sait-il pourquoi l'enum ne peut pas être abordé de cette manière ?

237voto

Günter Zöchbauer Points 21340

La portée du modèle est limitée aux membres de l'instance du composant. Si vous voulez faire référence à un élément, il doit être disponible à cet endroit.

class MyComponent {
  public get connectionResult(): typeof ConnectionResult {
    return ConnectionResult; 
  }
}

Dans le HTML, vous pouvez maintenant utiliser

*ngIf="connectionResult.Success"

Voir aussi Angular2 accède aux variables globales à partir d'un modèle HTML

1 votes

Puisque je suis strictement les normes de codage, quel type de données, je dois donner pour le connectionResult.

0 votes

Je ne sais pas. Je n'ai utilisé TypeScript que dans Plunker et il n'y avait pas de vérification de type. Je pense que le message d'erreur vous indique le type attendu lorsque vous utilisez un type incompatible, n'est-ce pas ?

0 votes

Merci, laissez-moi commencer une nouvelle conversation dans stack overflow

66voto

Nikhil Manapure Points 1651

Vous devrez l'écrire de la manière suivante dans .ts fichier.

enum Tenure { day, week, all }

export class AppComponent {
    tenure = Tenure.day
    TenureType = Tenure
}

Et maintenant en html vous pouvez utiliser ceci comme

*ngIf = "tenure == TenureType.day ? selectedStyle : unSelectedStyle"

J'espère que c'est plus clair maintenant. :)

6 votes

N'oubliez pas d'utiliser '=' et non ':', entre TenureType et Tenure, c'est-à-dire assignez le type, ne le définissez pas. Je viens de faire cette erreur en oubliant ce que @Nikhil avait écrit. +1

46voto

Ondra Peterka Points 1300

Vous pouvez simplement ajouter l'enum à votre composant comme propriété et utiliser le même nom de l'enum (Quarters) dans vos modèles :

enum Quarters{ Q1, Q2, Q3, Q4}

export class AppComponent {
   quarter = Quarters.Q1
   Quarters = Quarters //here you are creating a variable/alias to the enum
}

Dans votre modèle

<div *ngIf="quarter == Quarters.Q1">I=am only visible for Q1</div> 

La raison pour laquelle cela fonctionne est que la nouvelle propriété est fondamentalement de ce type :

TileType: typeof TileType

0 votes

Si vous souhaitez afficher le nom de l'enum, comme dans un fichier div ou mat-icon vous devez faire référence à l'enum, et non à l'élément directement. Plus facile à montrer qu'à expliquer : <mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>

0 votes

C'est certainement la manière la plus propre

0 votes

Cette option est bien meilleure que les autres...

7voto

import MyEnum from enums;  

.... Déclarer var ....

public myEnum = MyEnum;

et en utilisation html :

<div *ngIf="xxx === myEnum.DATA"> ... </div>

1voto

Pawel Cioch Points 375

Vous pouvez lier en tant que texte si l'enum est défini comme ci-dessous (ces valeurs n'appliqueront pas une valeur de chaîne json provenant de l'API).

  export enum SomeEnum {
      Failure = "Failure",
      Success = "Success",
  }

Dans le fichier .ts

public status: SomeEnum;

En .html

<div *ngIf="status == 'Success'">

Une autre méthode, testée dans Angular 8+, consiste à utiliser des enums avec des nombres.

  export enum SomeEnum {
      Failure = 0,
      Success = 1,
  }

Dans le fichier .ts

public status: SomeEnum;

En .html

<div *ngIf="status == 1">

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