Impossibile accedere all'enumerazione Typescript in HTML


86

Ho creato un'enumerazione con Typescript da utilizzare in MyService.service.ts MyComponent.component.ts e MyComponent.component.html.

export enum ConnectionResult {
    Success,
    Failed     
}

Posso facilmente ottenere e confrontare una variabile enum definita da MyService.service.ts:

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

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

Volevo anche usare l'enumerazione per un confronto all'interno del mio HTML usando l'istruzione * 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>

Il codice si compila ma il browser mi dà un errore:

Impossibile leggere la proprietà di undefined

inserisci qui la descrizione dell'immagine

Con la seguente riga di errore di indicazione html:

inserisci qui la descrizione dell'immagine

Qualcuno sa perché l'enum non può essere affrontato in questo modo?

Risposte:


152

L'ambito del modello è limitato ai membri dell'istanza del componente. Se vuoi fare riferimento a qualcosa, deve essere disponibile lì

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

Nell'HTML puoi ora usare

*ngIf="connectionResult.Success"

Vedi anche Angular2 accedi alle variabili globali dal template HTML


1
Dato che seguo rigorosamente gli standard di codifica, quale tipo di dati devo fornire per la connessione
— Risultato

Non lo so. Ho usato solo TypeScript in Plunker e non c'erano controlli di tipo. Mi aspetto che il messaggio di errore ti dica il tipo previsto quando ne usi uno incompatibile, non è vero?
— Günter Zöchbauer

Grazie, lasciami iniziare una nuova conversazione in stack overflow
— Nasrul Bharathi

1
Sì, solo un semplice membro della proprietà non ha funzionato per me, ma impostarlo come getter ha funzionato.
— Kon

1
Non come in altre risposte che puoi mantenere il nome. (potrebbe creare altri problemi, però, che non ho ancora scoperto)
— LosManos

49

Dovrai scriverlo nel seguente modo in .tsfile.

enum Tenure { day, week, all }

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

E ora in html puoi usare questo come

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

Spero sia più chiaro ora. :)


3
Non dimenticare di usare "=" e non ":", tra TenureType e Tenure, ovvero assegna il tipo senza definirlo. Ho appena commesso quell'errore trascurando ciò che aveva scritto @Nikhil. +1
— Jacques

26

Puoi semplicemente aggiungere l'enumerazione al tuo componente come proprietà e usare lo stesso nome dell'enumerazione (Quarters) nei tuoi modelli:

enum Quarters{ Q1, Q2, Q3, Q4}

export class AppComponent {
   quarter = Quarters.Q1
   Quarters = Quarters
}

Nel tuo modello

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

Il motivo per cui funziona è che la nuova proprietà è fondamentalmente di questo tipo:

TileType: typeof TileType

Se vuoi produrre il nome dell'enumerazione, come in a divo mat-icondevi fare riferimento all'enumerazione e non direttamente all'elemento. Più facile da mostrare che da spiegare:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
— LosManos

questo è sicuramente il modo più pulito
— d3vtoolsmith il

0

Puoi eseguire il binding come testo se enum definito come di seguito (quei valori non applicano un valore di stringa json proveniente dall'API)

  export enum SomeEnum {
      Failure,
      Success,
  }

Nel file .ts

public status: SomeEnum;

In .html

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

Un altro modo, testato in Angular 8+, è avere enumerazioni con numeri

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

Nel file .ts

public status: SomeEnum;

In .html

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


Credo che tutte le enumerazioni vengano fornite automaticamente con i numeri
— super IT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.