Angular 角通用状态转移初始值设定项
如何正确使用本模块 删除文档并使用此模块后,状态转移将在浏览器中停止工作。使用本模块的正确方法是什么 p.S.已在@nguniversal中固定/common@7.1.0发布,公关 如果已激发Angular 角通用状态转移初始值设定项,angular,angular-universal,Angular,Angular Universal,如何正确使用本模块 删除文档并使用此模块后,状态转移将在浏览器中停止工作。使用本模块的正确方法是什么 p.S.已在@nguniversal中固定/common@7.1.0发布,公关 如果已激发DOMContentLoaded事件,并且在添加侦听器之后 对于DOMContentLoaded事件,它将不会执行 我们可以通过以下检查来检查文档是否已加载 if (doc.readyState === "complete" || doc.readyState === "interactive") {
DOMContentLoaded
事件,并且在添加侦听器之后
对于DOMContentLoaded
事件,它将不会执行
我们可以通过以下检查来检查文档是否已加载
if (doc.readyState === "complete" || doc.readyState === "interactive") {
// document is ready
}
如果未激发DOMContentLoaded
,则我们可以监听它
function handler() {
// After DOMContentLoaded
}
document.addEventListener('DOMContentLoaded', handler);
因此,如果DOMContentLoaded
已经启动,我们需要resolve()
承诺。我修改了的StateTransferInitializerModule
模块代码,下面是代码
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { DOCUMENT } from '@angular/common';
export function domContentLoadedFactory(doc: Document) {
return () => new Promise ((resolve, _reject) => {
const contentLoaded = () => {
doc.removeEventListener('DOMContentLoaded', contentLoaded);
resolve();
};
if (doc.readyState === "complete" || doc.readyState === "interactive") {
// if DOMContentLoaded already fired
// document is already ready to go
resolve();
}
else{
// if DOMContentLoaded is not fired then we are listening the event.
doc.addEventListener('DOMContentLoaded', contentLoaded);
}
});
}
@NgModule({
providers: [
{provide: APP_INITIALIZER, multi: true, useFactory: domContentLoadedFactory, deps: [DOCUMENT]},
]
})
export class StateTransferInitializerModule {
}
作为参考,添加了代码。这是一个很好的问题,我对Angular Universal提出了相同的答案,他们接受了,最近它被合并为Angular Universal。