Nie można podejść do wyliczenia Typescript w HTML


86

Zrobiłem wyliczenie z Typescript do użycia w MyService.service.ts MyComponent.component.ts i MyComponent.component.html.

export enum ConnectionResult {
    Success,
    Failed     
}

Mogę łatwo pobrać i porównać zdefiniowaną zmienną wyliczenia z MyService.service.ts:

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

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

Chciałem również użyć wyliczenia do porównania w moim kodzie HTML za pomocą instrukcji * 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>

Kod kompiluje się, ale przeglądarka wyświetla błąd:

Nie można odczytać właściwości undefined

wprowadź opis obrazu tutaj

Z następującą linią błędu wskazania HTML:

wprowadź opis obrazu tutaj

Czy ktoś wie, dlaczego do wyliczenia nie można podejść w ten sposób?

Odpowiedzi:


152

Zakres szablonu jest ograniczony do elementów składowych instancji. Jeśli chcesz się do czegoś odnieść, to musi być tam dostępne

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

W HTML możesz teraz użyć

*ngIf="connectionResult.Success"

Zobacz także Angular2 dostęp do zmiennych globalnych z szablonu HTML


1
Ponieważ ściśle przestrzegam standardów kodowania, jaki typ danych muszę podać dla połączenia
Wynik

Nie wiem Użyłem tylko TypeScript w Plunkerze i nie było sprawdzania typów. Spodziewałbym się, że komunikat o błędzie informuje o oczekiwanym typie, gdy używasz niezgodnego, prawda?
Günter Zöchbauer

Dzięki, pozwól mi rozpocząć nową rozmowę w przepełnieniu stosu
Nasrul Bharathi

1
Tak, tylko zwykły członek nieruchomości nie działał dla mnie, ale ustawienie go jako gettera działało.
Kon

1
Nie tak jak w innej odpowiedzi , że możesz zachować imię. (może jednak powodować inne problemy, których jeszcze nie odkryłem)
LosManos

50

Będziesz musiał zapisać to w następujący sposób w .tspliku.

enum Tenure { day, week, all }

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

A teraz w html możesz używać tego jak

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

Mam nadzieję, że teraz jest to bardziej jasne. :)


3
Nie zapomnij użyć '=' a nie ':' pomiędzy TenureType i Tenure, tj. Przypisz typ, nie definiuj go. Właśnie popełniłem ten błąd, pomijając to, co napisał @Nikhil. +1
Jacques

26

Możesz po prostu dodać wyliczenie do swojego składnika jako właściwość i użyć tej samej nazwy wyliczenia (kwartały) w swoich szablonach:

enum Quarters{ Q1, Q2, Q3, Q4}

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

W Twoim szablonie

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

Powodem, dla którego to działa, jest to, że nowa porcja jest w zasadzie tego typu:

TileType: typeof TileType

Jeśli chcesz wyświetlić nazwę wyliczenia, na przykład w a divlub mat-icon, musisz odwołać się do wyliczenia, a nie bezpośrednio do elementu. Łatwiej pokazać niż wyjaśnić:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
LosManos

to zdecydowanie najczystszy sposób
d3vtoolsmith

0

Możesz powiązać jako tekst, jeśli wyliczenie zdefiniowane jak poniżej (te wartości nie będą wymuszać wartości ciągu json pochodzącej z interfejsu API)

  export enum SomeEnum {
      Failure,
      Success,
  }

W pliku .ts

public status: SomeEnum;

W .html

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

Innym sposobem testowanym w Angular 8+ jest tworzenie wyliczeń z liczbami

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

W pliku .ts

public status: SomeEnum;

W .html

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


Wierzę, że wszystkie wyliczenia przychodzą z liczbami automatycznie
super informatyk
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.