使用 AoT 编译的 useFactory 与 useValue
useFactory vs useValue with AoT compilation
我使用 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 },
为什么 useValue
得到 undefined
而 useFactory
得到 true
?
我的猜测是 AoT
在 NgModule
结构之外静态分析您的代码。所以它看到 window.location.search.includes
并提前执行。但是在编译时,这显然会returnundefined
。在使用 factory
的情况下,它不会尝试提前执行正文,只会在 运行 时间执行。
这是 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 },
为什么 useValue
得到 undefined
而 useFactory
得到 true
?
我的猜测是 AoT
在 NgModule
结构之外静态分析您的代码。所以它看到 window.location.search.includes
并提前执行。但是在编译时,这显然会returnundefined
。在使用 factory
的情况下,它不会尝试提前执行正文,只会在 运行 时间执行。
这是 AOT 的(许多)陷阱之一。始终尝试让每个符号都可以静态分析