在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;
,它就会起作用。
如何解决模块声明的问题?
答案 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 {}