无法在HTML中使用Typescript枚举


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

我还想通过* ngIf语句将枚举用于HTML内的比较:

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

代码可以编译,但是浏览器给我一个错误:

无法读取未定义的属性

在此处输入图片说明

使用以下html指示错误行:

在此处输入图片说明

有谁知道为什么不能这样访问枚举?

Answers:


152

模板的范围仅限于组件实例成员。如果您想引用某些内容,则需要在此处使用

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

在HTML中,您现在可以使用

*ngIf="connectionResult.Success"

另请参阅Angular2从HTML模板访问全局变量


1
由于我严格遵守编码标准,数据类型,因此我必须为连接结果指定
Nasrul Bharathi

我不知道。我只在Plunker中使用了TypeScript,并且没有类型检查。我希望错误消息告诉您使用不兼容的类型时的期望类型,不是吗?
贡特·绍赫鲍尔(GünterZöchbauer)

谢谢,让我在堆栈溢出中开始新的对话
Nasrul Bharathi

1
是的,只是普通的财产会员对我不起作用,但是将其设置为吸气剂是可行的。
Kon

1
不能像其他答案那样保留名称。(虽然可能会引起其他问题,但我还没有发现)
LosManos

49

您将必须按照以下方式在.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
雅克(Jacques)

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

如果你想输出的枚举的名称,就像在divmat-icon你要引用枚举,而不是直接的项目。显示起来比解释起来容易:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
LosManos

这绝对是最干净的方法
d3vtoolsmith

0

如果枚举定义如下,则可以绑定为文本(这些值将不强制来自API的json字符串值)

  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人士
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.