2017-08-07 12 views
3

私はwindow.locationを使用して注射用に設定します。私は、変数useファクトリーvs useValueとAoTコンパイル

const flag = window.location.search.includes('flag'); 
... 
{ provide: FLAG, useValue: flag }, 

を定義し、私が得るのはなぜ期待どおりにJITコンパイル で動作します。しかし、私はIBMアカデミーに切り替えたとき、それは両方のケースで useFactory作品

export function flagFactory() { 
    return window.location.search.includes('flag');; 
} 
... 
{ provide: FLAG, useFactory: flagFactory }, 

を壊し輸入近い私のモジュールで undefineduseValuetrueuseFactory

+0

ここで、あなたのコードのこの部分を定義しますか? 'const flag = ...'? RootModuleの – PierreDuc

+0

をインポートと一緒に – mgrinko

答えて

1

AoTは、NgModule構造の外側のコードを静的に分析していると思います。したがって、それはwindow.location.search.includesを見て、これを前もって実行します。しかし、コンパイル時には、これは明らかにundefinedを返します。 factoryを使用している場合は、実行時にのみ本体を前もって実行しようとはしません。

これはAOTの(多くの)落とし穴の1つです。すべてのシンボルを常に静的に解析できるようにしてください。

+0

ありがとう – mgrinko

関連する問題