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.