Typescript-Aufzählung in HTML kann nicht angegangen werden

86

Ich habe eine Aufzählung mit Typescript erstellt, die in MyService.service.ts MyComponent.component.ts und MyComponent.component.html verwendet werden soll.

export enum ConnectionResult {
    Success,
    Failed     
}

Ich kann eine definierte Enum-Variable leicht von MyService.service.ts abrufen und vergleichen:

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

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

Ich wollte die Aufzählung auch für einen Vergleich in meinem HTML-Code mit der Anweisung * ngIf verwenden:

<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>

Der Code wird kompiliert, aber der Browser gibt mir einen Fehler:

Eigenschaft von undefined kann nicht gelesen werden

Geben Sie hier die Bildbeschreibung ein

Mit der folgenden HTML-Anzeigefehlerzeile:

Geben Sie hier die Bildbeschreibung ein

Weiß jemand, warum die Aufzählung nicht so angegangen werden kann?

Klyner
quelle

Antworten:

152

Der Umfang der Vorlage ist auf die Komponenteninstanzmitglieder beschränkt. Wenn Sie sich auf etwas beziehen möchten, muss es dort verfügbar sein

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

Im HTML können Sie jetzt verwenden

*ngIf="connectionResult.Success"

Siehe auch Angular2 greift über eine HTML-Vorlage auf globale Variablen zu

Günter Zöchbauer
quelle
1
Da ich mich strikt an die Kodierungsstandards
halte
Ich weiß es nicht. Ich habe TypeScript nur in Plunker verwendet und es gab keine Typprüfungen. Ich würde erwarten, dass die Fehlermeldung den erwarteten Typ angibt, wenn Sie einen inkompatiblen Typ verwenden, nicht wahr?
Günter Zöchbauer
Danke, lassen Sie mich ein neues Gespräch im Stapelüberlauf beginnen
Nasrul Bharathi
1
Ja, nur ein einfaches Immobilienmitglied hat bei mir nicht funktioniert, aber das Einstellen als Getter hat funktioniert.
Kon
1
Nicht wie in anderen Antworten, dass Sie den Namen behalten können. (könnte aber andere Probleme verursachen, die ich noch nicht entdeckt habe)
LosManos
50

Sie müssen es wie folgt in eine .tsDatei schreiben .

enum Tenure { day, week, all }

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

Und jetzt in HTML können Sie dies wie verwenden

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

Ich hoffe es ist jetzt klarer. :) :)

Nikhil Manapure
quelle
3
Vergessen Sie nicht, '=' und nicht ':' zwischen TenureType und Tenure zu verwenden, dh den Typ zuzuweisen, definieren Sie ihn nicht. Ich habe gerade diesen Fehler gemacht, als ich übersehen habe, was @Nikhil geschrieben hat. +1
Jacques
26

Sie können die Komponente einfach als Eigenschaft zu Ihrer Komponente hinzufügen und in Ihren Vorlagen denselben Namen wie die Aufzählung (Quartale) verwenden:

enum Quarters{ Q1, Q2, Q3, Q4}

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

In Ihrer Vorlage

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

Der Grund, warum dies funktioniert, ist, dass das neue Porperty im Grunde genommen von diesem Typ ist:

TileType: typeof TileType
Ondrej Peterka
quelle
Wenn Sie den Namen der Aufzählung wie in a ausgeben möchten divoder mat-iconauf die Aufzählung und nicht direkt auf das Element verweisen müssen. Einfacher zu zeigen als zu erklären:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
LosManos
Dies ist definitiv der sauberste Weg
d3vtoolsmith
0

Sie können als Text binden, wenn die Enumeration wie folgt definiert ist (diese Werte erzwingen keinen von der API stammenden JSON-Zeichenfolgenwert).

  export enum SomeEnum {
      Failure,
      Success,
  }

In der .ts-Datei

public status: SomeEnum;

In .html

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

Eine andere Möglichkeit, die in Angular 8+ getestet wurde, besteht darin, Aufzählungen mit Zahlen zu erstellen

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

In der .ts-Datei

public status: SomeEnum;

In .html

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

Pawel Cioch
quelle
Ich glaube, alle Enums kommen automatisch mit Zahlen
Super-IT-Typ
Sie können glauben, was Sie wollen, aber ich habe es getestet und somit 2 Ansätze bereitgestellt. Also nein, wenn Sie keine Nummer angeben, wird diese nicht mit einer Nummer wie in C # geliefert. Dieses Verhalten kann der TypeScript-Version (+ möglicherweise Angular frx-Version)
unterliegen