如何在Angular AOT中使用枚举(在单独的文件中)?

时间:2017-09-25 17:05:45

标签: angular angular-cli angular-aot

将基于角度的应用程序(angular-cli)从运行良好的基于​​JIT的szenario转换为基于AOT的szenario。 AOT-build运行良好。

在打开生成的网页时,我收到无法读取未定义错误的属性“无”。这些错误是由未定义的枚举在运行时产生的。

非常简化的示例(包含2个单独的文件)

action-type.enum.ts (枚举在单独的文件中)

export enum eActionType {
    none,
    actionA
    ...
}

test.component.ts (单独文件中的组件)

import { eActionType } from './action-type.enum';

@Component({ ... })
export class Test {

    // @Runtime eActionType (eActionType.none) will be undefined
    private/protected/public actionType: eActionType = eActionType.none;
}
尽管正在导入,但

eActionType不适用于test.component.ts。

可能的解决方案1 ​​ - 同一文件中的枚举(不可取)

test.component.ts

// Exported enum within same file
export enum eActionType {
    none,
    actionA
    ...
}

@Component({ ... })
export class Test {

    // @Runtime eActionType is available
    private/protected/public actionType: eActionType = eActionType.none;
}

如果枚举是在同一个文件中声明的,它将在运行时正常工作。但这不可取,因为与可以导入多个位置的外部文件中的枚举相比,人们会失去可维护性。

可能的解决方案2 - 具有静态属性的类而不是枚举(不可取)

action-type.enum.ts (枚举在单独的文件中)

export class eActionType {
    static none    = 0;
    static actionA = 1;
    ...
}

test.component.ts (单独文件中的组件)

import { eActionType } from './action-type.enum';

@Component({ ... })
export class Test {

    // @Runtime eActionType is available as static property of eActionType        
    private/protected/public actionType: eActionType = eActionType.none;
}

也没有非常漂亮的解决方案,但至少只有前枚举的声明,而不是消费者代码必须在所有出现时改变。

如何强制在外部文件中声明的正确枚举可以在运行时在其他位置访问?

2 个答案:

答案 0 :(得分:0)

将您的变量公开。

public actionType: eActionType = eActionType.none;

答案 1 :(得分:0)

<强>解决方案:

  • 完全清空node_modules
  • npm install and off you go ...

我花了几天时间,阅读了我能找到的所有内容(非真正相关),修改了我的代码一百次。

巧合的是,我意识到ng的脚手架正在抛出错误信息(服务和建立没有)。清理了所有东西,做了一个全新的npm安装 - 突然之间应该开箱即用的所有东西都是开箱即用的。我不相信我浪费了几天。 (会留下这个问题,因为它可能会给别人一个暗示)

如果出现问题并且网络上没有其他人报告同样的问题,那么就要开始怀疑并首先寻求最简单的解决方案:

- &GT; 进行干净的全新安装