useFactory против useValue с компиляцией AoT
Я использую window.location
настроить для инъекций. В моем модуле рядом с импортом я определяю переменную
const flag = window.location.search.includes('flag');
...
{ provide: FLAG, useValue: flag },
и это работает, как и ожидалось с JIT-компиляцией, но когда я переключаюсь на AoT, он ломаетсяuseFactory
работает в обоих случаях
export function flagFactory() {
return window.location.search.includes('flag');;
}
...
{ provide: FLAG, useFactory: flagFactory },
Почему я получаю undefined
с useValue
а также true
с useFactory
?
1 ответ
Решение
Я думаю, что AoT
статически анализирует ваш код за пределами NgModule
состав. Так оно и видит window.location.search.includes
и выполняет это раньше времени. Но во время компиляции это, очевидно, вернет undefined
, В случае использования factory
, он не будет пытаться выполнить тело раньше времени, только во время выполнения.
Это одна из (многих) ловушек AOT. Всегда старайтесь, чтобы каждый символ был статически анализируемым