0

将基于角度的应用程序 (angular-cli) 从运行良好的基于​​ JIT 的场景转换为基于 AOT 的场景。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 - 同一文件中的枚举(不可取)

测试组件.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;
}

也没有真正漂亮的解决方案,但至少在所有情况下都必须更改前枚举的声明,而不是消费者代码。

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

4

2 回答 2

1

解决方案:

  • 完全为空的 node_modules
  • npm install 然后就可以了...

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

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

如果出现不应该出现的问题并且网络上没有其他人报告同样的问题,请保持怀疑并首先寻求最简单的解决方案:

->进行全新安装

于 2017-09-27T10:35:40.463 回答
0

公开你的变量。

public actionType: eActionType = eActionType.none;
于 2017-09-25T20:18:30.957 回答