Не вдається наблизити перелік Typescript у HTML


86

Я створив перерахування за допомогою Typescript для використання в MyService.service.ts MyComponent.component.ts та MyComponent.component.html.

export enum ConnectionResult {
    Success,
    Failed     
}

Я можу легко отримати та порівняти визначену змінну переліку з MyService.service.ts:

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

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

Я також хотів використати перелік для порівняння в моєму HTML, використовуючи оператор * 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>

Код компілюється, але браузер видає мені помилку:

Не вдається прочитати властивість undefined

введіть тут опис зображення

З таким рядком помилки індикації html:

введіть тут опис зображення

Хтось знає, чому до переліку не можна підходити так?

Відповіді:


152

Сфера застосування шаблону обмежена членами екземпляра компонента. Якщо ви хочете посилатися на щось, воно повинно бути там

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

Тепер ви можете використовувати HTML-код

*ngIf="connectionResult.Success"

Див. Також глобальні змінні Angular2 для доступу до шаблону HTML


1
Оскільки я суворо дотримуюсь стандартів кодування, якого типу даних, я повинен надати для підключення
Результат

Не знаю. Я використовував TypeScript лише в Plunker, і перевірок типу не було. Я б очікував, що повідомлення про помилку повідомляє вам очікуваний тип, коли ви використовуєте несумісний, чи не так?
Günter Zöchbauer

Дякую, дозвольте мені розпочати нову розмову в переповненому стеку
Насрул Бхараті

1
Так, просто звичайний член майна не працював у мене, але встановлення його як отримання отримувача спрацювало.
Kon

1
Не так, як в іншій відповіді, що ви можете зберегти ім’я. (хоча можуть створити інші проблеми, ті, яких я ще не виявив)
LosManos,

50

Вам доведеться записати це наступним чином у .tsфайл.

enum Tenure { day, week, all }

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

І тепер у html ви можете використовувати це як

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

Сподіваюся, зараз це стає більш зрозумілим. :)


3
Не забувайте використовувати '=', а не ':', між TenureType та Tenure, тобто присвоєння типу не визначайте. Я щойно зробив цю помилку, не помічаючи написаного @Nikhil. +1
Жак

26

Ви можете просто додати перелік до свого компонента як властивість і використовувати те саме ім'я переліку (Квартали) у своїх шаблонах:

enum Quarters{ Q1, Q2, Q3, Q4}

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

У вашому шаблоні

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

Причина, по якій це працює, полягає в тому, що нова портовість в основному має такий тип:

TileType: typeof TileType

Якщо ви хочете вивести ім'я переліку, наприклад, у divабо mat-iconвам потрібно посилатися на перелік, а не на елемент безпосередньо. Показати простіше, ніж пояснити:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
LosManos

це, безумовно, найчистіший спосіб
d3vtoolsmith

0

Ви можете прив’язати як текст, якщо перелічення визначено, як показано нижче (ці значення не застосовуватимуть значення рядка json, що надходить з API)

  export enum SomeEnum {
      Failure,
      Success,
  }

У файлі .ts

public status: SomeEnum;

У .html

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

Інший спосіб, перевірений у Angular 8+, - це перерахування чисел

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

У файлі .ts

public status: SomeEnum;

У .html

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


Я вважаю, що всі переліки отримують цифри автоматично
супер IT хлопець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.