Если событие DOMContentLoaded
уже запущено и после добавления прослушивателя для события DOMContentLoaded
оно не будет выполнено.
Мы можем проверить, загружен документ или нет, с помощью следующей проверки.
if (doc.readyState === "complete" || doc.readyState === "interactive") {
// document is ready
}
Если DOMContentLoaded
не запущено, мы можем его прослушать.
function handler() {
// After DOMContentLoaded
}
document.addEventListener('DOMContentLoaded', handler);
Так что нам нужно resolve()
обещание, если DOMContentLoaded
уже выполнено,Я изменил StateTransferInitializerModule
код модуля Angular Universal и следующий код:
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 {
}
Для справки добавлен код стека .