typescript 访问Angular html模板中的常量枚举

ih99xse1  于 2023-03-04  发布在  TypeScript
关注(0)|答案(4)|浏览(143)

假设我有一个常量枚举:

export const enum MyConstEnum{
    Value1 = 'Value1',
    Value2 = 'Value2',
    Value3 = 'Value3'
}

现在我想在我的Angular 模板中使用它:

<span *ngIf="name === MyConstEnum.Value1">This has some value</value>

但是,这是不可能的,因为MyConstEnum不被模板看到,所以问题是如何在Angular html模板中访问const enum
如果枚举不是这样的常量

export enum MyEnum{
    Value1 = 'Value1',
    Value2 = 'Value2',
    Value3 = 'Value3'
}

有一个在模板组件中创建属性的解决方案

public get MyEnumInComponent() {
    return MyEnum;
  }

MyEnumInComponent将在HTML中访问。然而,我有const enum
对于这个我不能像上面那样定义属性。解决方案是什么(除了将const enum更改为enum)?

9q78igpj

9q78igpj1#

我可以在此链接https://github.com/angular/angular/issues/25963上看到,这是已知问题,并且是专门针对const枚举的。

There is also a work arround suggested in the discussion on the url:
templateImports: [someConstant, UserStatus, isDevMode]
This would not work, but the below could:

templateImports: {someConstant, UserStatus, isDevMode}
dz6r00yl

dz6r00yl2#

如果TypeScript不清除发出的JavaScript代码中的const枚举声明,则可能出现这种情况。
有专门的编译器选项preserveConstEnums用于此目的:

    • 系统配置json**
{
  "compilerOptions": {
    ...
    "preserveConstEnums": true,
    ...
  },
  ...
}

现在,假设你有

    • 常量枚举ts**
export const enum MyConstEnum {
    Value1 = 'Value1',
    Value2 = 'Value2',
    Value3 = 'Value3'
}

您可以在组件中导入它,如:

import * as constEnumModule from './const-enum';

class SomeComponent {
  MyConstEnum = (constEnumModule as any).MyConstEnum;
}

最后,它应该在此组件的模板中可用:

<span *ngIf="name === MyConstEnum.Value1">This has some value</value>
bis0qfac

bis0qfac3#

你可以在你的组件中创建一个与枚举同名的属性,并且你可以像在ts文件中一样访问枚举。你可以通过导入它或者在ts文件中声明它来实现这一点。

import { MyConstEnum } from './enum'

OR

enum MyConstEnum {
    Value1 = 'Value1',
    Value2 = 'Value2',
    Value3 = 'Value3'
}

@Component({
    selector: 'app-my-component',
    templateUrl: './my-component.page.html',
    styleUrls: ['./my-component.page.scss'],
})
export class MyComponent {
    MyConstEnum = MyConstEnum;
    ...
}

在html模板中:

<span *ngIf="name === MyConstEnum.Value1">{{ MyConstEnum.Value1 }}</value>
tjvv9vkg

tjvv9vkg4#

我通过将const枚举类型替换为类中的静态属性来绕过这个问题,如下所示:

export class MyEnum{
    static  Value1 = 'Value1',
    static  Value2 = 'Value2',
    static  Value3 = 'Value3'
}

相关问题