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. Всегда старайтесь, чтобы каждый символ был статически анализируемым

Другие вопросы по тегам