Невозможно подойти к перечислению 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:

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

Кто-нибудь знает, почему к enum нельзя так подходить?

Ответы:


152

Область действия шаблона ограничена членами экземпляра компонента. Если вы хотите сослаться на что-то, это должно быть там

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

В HTML теперь вы можете использовать

*ngIf="connectionResult.Success"

См. Также доступ к глобальным переменным Angular2 из HTML-шаблона


1
Поскольку я строго следую стандартам кодирования, какой тип данных я должен указать для connectionResult
Насрул Бхарати

Я не знаю. Я использовал только TypeScript в Plunker, и никаких проверок типов не было. Я ожидал, что сообщение об ошибке сообщит вам ожидаемый тип, когда вы используете несовместимый, не так ли?
Günter Zöchbauer

Спасибо, позвольте мне начать новый разговор о переполнении стека
Насрул Бхарати

1
Да, просто элемент простого свойства у меня не работал, но установка его как получателя сработала.
Кон

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

51

Вам нужно будет записать его в .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

Вы можете просто добавить перечисление в свой компонент как свойство и использовать то же имя перечисления (Quarters) в своих шаблонах:

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


Я считаю, что все перечисления приходят с числами автоматически
супер-

Вы можете верить во что хотите, но я проверил это и предложил 2 подхода. Так что нет, если вы не укажете номер, он не будет иметь номера, как в C #. Такое поведение может зависеть от версии TypeScript (+ возможно, версии Angular frx)
Павел Чиох
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.