ChatGPT解决这个技术问题 Extra ChatGPT

无法在 HTML 中接近 Typescript 枚举

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

代码编译但浏览器给了我一个错误:

无法读取未定义的属性

https://i.stack.imgur.com/wYlMy.png

带有以下 html 指示错误行:

https://i.stack.imgur.com/ohEKw.png

有谁知道为什么不能像这样接近枚举?


H
Hypenate

模板的范围仅限于组件实例成员。如果你想引用它需要在那里可用的东西

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

在 HTML 中,您现在可以使用

*ngIf="connectionResult.Success"

另请参阅Angular2 access global variables from HTML template


由于我严格遵循编码标准,什么数据类型,我必须为 connectionResult
我不知道。我只在 Plunker 中使用了 TypeScript,并且没有进行类型检查。当您使用不兼容的类型时,我希望错误消息会告诉您预期的类型,不是吗?
是的,只是一个普通的属性成员对我不起作用,但将其设置为 getter 是可行的。
不像在 other answer 中那样,您可以保留名称。 (虽然可能会产生其他问题,但我还没有发现)
没有这个错误? error TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment or type query.
N
Nikhil Manapure

您必须按以下方式将其写入 .ts 文件。

enum Tenure { day, week, all }

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

现在在 html 中你可以像这样使用它

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

我希望现在更清楚了。 :)


不要忘记在TenureType 和Tenure 之间使用'=' 而不是':',即分配类型不要定义它。我只是犯了这个错误,忽略了@Nikhil 写的内容。 +1
简单易行的解决方案。这应该是公认的答案。
M
Mauricio Gracia Gutierrez

您可以将枚举作为属性添加到组件中,并在模板中使用与枚举(Quarters)相同的名称:

enum Quarters{ Q1, Q2, Q3, Q4}

export class AppComponent {
   quarter = Quarters.Q1
   Quarters = Quarters //here you are creating a variable/alias to the enum
}

在您的模板中

<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>
这绝对是最干净的方式
这个选项比其他选项好得多...
为什么我会得到:This condition will always return 'false' since the types <enum values> have no overlap.
J
João Marcos Santos Teixeira
import MyEnum from enums;  

.... 声明 var ....

public myEnum = MyEnum;

并在 html 中使用:

<div *ngIf="xxx === myEnum.DATA"> ... </div>

J
Jöcker

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

  export enum SomeEnum {
      Failure = "Failure",
      Success = "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">


我相信所有枚举都会自动带有数字
您可以相信自己想要的,但我对其进行了测试,因此提供了两种方法。所以不,如果你不指定一个数字,它不会像 C# 中那样带有一个数字。这可能的行为可能受 TypeScript 版本的影响(+ 可能是 Angular frx 版本)
D
Dimuth

在您的服务中

export enum ConnectionResult {
    Success,
    Failed     
}

将枚举分配给 TypeScript 文件中的变量

ConnectionResult = ConnectionResult; 

然后从 HTML 中读取您的枚举,如下所示

*ngIf="result == ConnectionResult.Success"