Angular 2 AOT“表达式不支持”错误

时间:2016-11-14 12:49:03

标签: angular angular2-aot

在Angular 2中,我想仅针对IE9使用哈希策略。为此,我将路由器配置为仅在检测到IE9浏览器时才使用哈希策略。

使用tsc编译时这是有用的:

const useHash: boolean = (typeof window.history.pushState) !== 'function';

@NgModule({
  declarations: [AppComponent],
  imports: [
    RouterModule.forRoot(appRoutes, {initialNavigation : false, useHash : useHash})
  ]
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

然而,ngc编译器(AOT编译)不接受它。 ngc抛出以下错误(在const声明行上)。

  

在静态解析符号值时遇到错误。表达形式不受支持

我也尝试过(基于这篇文章:https://medium.com/@isaacplmann/making-your-angular-2-library-statically-analyzable-for-aot-e1c6f3ebedd5#.h4pnszi13):

@NgModule({
  declarations: [AppComponent],
  imports: [
      RouterModule.forRoot(appRoutes, {initialNavigation : false, useHash : AppModule.useHash})
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {
  static useHash: boolean = (typeof window.history.pushState) !== 'function';
}

但是我得到了同样的错误(这次在提供者行上)。请注意,如果我执行static useHash: boolean = false;,它就会起作用。

如何解决模块声明的问题?

2 个答案:

答案 0 :(得分:0)

如果您只是导出useHash函数(来自第一个代码段),它应该可以正常工作。请参阅下面的代码片段:

export function useHash() {
  return (typeof window.history.pushState) !== 'function';
}

@NgModule({
  declarations: [AppComponent],
  imports: [
    RouterModule.forRoot(appRoutes, {initialNavigation : false, useHash : useHash})
  ]
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

答案 1 :(得分:0)

你遇到的问题确实很奇怪,由于TS限制应该尽快解决,AOT编译器在获取全貌方面有点受限。

您可以跟踪此问题以获取更新 https://github.com/angular/angular/issues/13138

要解决您的问题,您只需要在角度编译器上玩一个小技巧......

const rConfig = { useHash: true, preloadingStrategy: PreloadAllModules };
rConfig.useHash = (typeof window.history.pushState) !== 'function';


@NgModule({
  declarations: [AppComponent],
  imports: [
    RouterModule.forRoot(appRoutes, rConfig)
  ]
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}