2016-11-14 2 views
1

В Angular 2 Я хотел бы использовать стратегию хэша только для IE9. Для этого я настраиваю маршрутизатор на использование хэш-стратегии только в том случае, если я обнаруживаю браузер IE9.Угловая 2 Ошибка AOT «Форма выражения не поддерживается»

Это работает при компиляции с 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

Если вы просто экспортируете функцию 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 {} 
+0

Спасибо за предложение, но без него не работает. Я получаю «Аргумент типа» {initialNavigation: false; useHash:() => boolean; } 'не присваивается параметру типа ExtraOptions. Типы собственности «useHash» несовместимы. ». Если я попытаюсь использовать 'useHash: useHash()', я получаю исходную ошибку. – j3r6me

0

Проблема у вас есть на самом деле странно, AOT компилятор немного ограничены в получении полной картины из-за ограничения TS, которые должны быть решены в ближайшее время.

Вы можете отслеживать этот вопрос для обновления 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 {}