SSR-Angular Universal 9加载我的根两次并挂起
我试图找到为什么我的代码使用Angular 9 SSR绑定root两次 我尝试了eventReplayer.replayAll()技巧,但我仍然被卡住了,我注意到当我滚动到页面时,我最终得到了正确的根,并且删除了另一个根(ng non bindable),所以我删除了SSR-Angular Universal 9加载我的根两次并挂起,angular,server-side-rendering,angular9,angular-universal,Angular,Server Side Rendering,Angular9,Angular Universal,我试图找到为什么我的代码使用Angular 9 SSR绑定root两次 我尝试了eventReplayer.replayAll()技巧,但我仍然被卡住了,我注意到当我滚动到页面时,我最终得到了正确的根,并且删除了另一个根(ng non bindable),所以我删除了PrebootModule,只是为了缩小问题,我在dom中得到了一个根,但应用程序无法正常运行 应用程序组件.ts BrowserModule.withServerTransition({appId: 'dcaa'}), Preb
PrebootModule
,只是为了缩小问题,我在dom中得到了一个根,但应用程序无法正常运行
应用程序组件.ts
BrowserModule.withServerTransition({appId: 'dcaa'}),
PrebootModule.withConfig({appRoot: 'dcaa-root'}),
.
.
.
{
provide: APP_INITIALIZER,
useFactory: function (document: HTMLDocument, platformId: Object): Function {
return () => {
if (isPlatformBrowser(platformId)) {
const dom = getDOM();
const styles: any[] = Array.prototype.slice.apply(document.querySelectorAll('style[ng-transition]'));
styles.forEach(el => {
// Remove ng-transition attribute to prevent Angular appInitializerFactory
// to remove server styles before preboot complete
el.removeAttribute('ng-transition');
});
document.addEventListener('PrebootComplete', () => {
// After preboot complete, remove the server scripts
setTimeout(() => styles.forEach(el => dom.remove(el)));
});
}
};
},
deps: [DOCUMENT, PLATFORM_ID],
multi: true
}
imports: [RouterModule.forRoot(routes, {
scrollPositionRestoration: 'disabled',
relativeLinkResolution: 'corrected',
preloadingStrategy: PreloadAllModules,
initialNavigation: 'enabled'
}),
imports: [
AppModule,
ServerModule,
ServerTransferStateModule,
FlexLayoutServerModule
],
document.addEventListener('DOMContentLoaded', () => {
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch(err => console.log(err));
});
应用程序路由.ts
BrowserModule.withServerTransition({appId: 'dcaa'}),
PrebootModule.withConfig({appRoot: 'dcaa-root'}),
.
.
.
{
provide: APP_INITIALIZER,
useFactory: function (document: HTMLDocument, platformId: Object): Function {
return () => {
if (isPlatformBrowser(platformId)) {
const dom = getDOM();
const styles: any[] = Array.prototype.slice.apply(document.querySelectorAll('style[ng-transition]'));
styles.forEach(el => {
// Remove ng-transition attribute to prevent Angular appInitializerFactory
// to remove server styles before preboot complete
el.removeAttribute('ng-transition');
});
document.addEventListener('PrebootComplete', () => {
// After preboot complete, remove the server scripts
setTimeout(() => styles.forEach(el => dom.remove(el)));
});
}
};
},
deps: [DOCUMENT, PLATFORM_ID],
multi: true
}
imports: [RouterModule.forRoot(routes, {
scrollPositionRestoration: 'disabled',
relativeLinkResolution: 'corrected',
preloadingStrategy: PreloadAllModules,
initialNavigation: 'enabled'
}),
imports: [
AppModule,
ServerModule,
ServerTransferStateModule,
FlexLayoutServerModule
],
document.addEventListener('DOMContentLoaded', () => {
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch(err => console.log(err));
});
app.server.module.ts
BrowserModule.withServerTransition({appId: 'dcaa'}),
PrebootModule.withConfig({appRoot: 'dcaa-root'}),
.
.
.
{
provide: APP_INITIALIZER,
useFactory: function (document: HTMLDocument, platformId: Object): Function {
return () => {
if (isPlatformBrowser(platformId)) {
const dom = getDOM();
const styles: any[] = Array.prototype.slice.apply(document.querySelectorAll('style[ng-transition]'));
styles.forEach(el => {
// Remove ng-transition attribute to prevent Angular appInitializerFactory
// to remove server styles before preboot complete
el.removeAttribute('ng-transition');
});
document.addEventListener('PrebootComplete', () => {
// After preboot complete, remove the server scripts
setTimeout(() => styles.forEach(el => dom.remove(el)));
});
}
};
},
deps: [DOCUMENT, PLATFORM_ID],
multi: true
}
imports: [RouterModule.forRoot(routes, {
scrollPositionRestoration: 'disabled',
relativeLinkResolution: 'corrected',
preloadingStrategy: PreloadAllModules,
initialNavigation: 'enabled'
}),
imports: [
AppModule,
ServerModule,
ServerTransferStateModule,
FlexLayoutServerModule
],
document.addEventListener('DOMContentLoaded', () => {
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch(err => console.log(err));
});
main.ts
BrowserModule.withServerTransition({appId: 'dcaa'}),
PrebootModule.withConfig({appRoot: 'dcaa-root'}),
.
.
.
{
provide: APP_INITIALIZER,
useFactory: function (document: HTMLDocument, platformId: Object): Function {
return () => {
if (isPlatformBrowser(platformId)) {
const dom = getDOM();
const styles: any[] = Array.prototype.slice.apply(document.querySelectorAll('style[ng-transition]'));
styles.forEach(el => {
// Remove ng-transition attribute to prevent Angular appInitializerFactory
// to remove server styles before preboot complete
el.removeAttribute('ng-transition');
});
document.addEventListener('PrebootComplete', () => {
// After preboot complete, remove the server scripts
setTimeout(() => styles.forEach(el => dom.remove(el)));
});
}
};
},
deps: [DOCUMENT, PLATFORM_ID],
multi: true
}
imports: [RouterModule.forRoot(routes, {
scrollPositionRestoration: 'disabled',
relativeLinkResolution: 'corrected',
preloadingStrategy: PreloadAllModules,
initialNavigation: 'enabled'
}),
imports: [
AppModule,
ServerModule,
ServerTransferStateModule,
FlexLayoutServerModule
],
document.addEventListener('DOMContentLoaded', () => {
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch(err => console.log(err));
});
在浏览器端的ngAfterViewInit期间,我尝试操作DOM时,preboot也遇到了同样的问题,这导致PrebootComplete无法正常启动,因为DOM已更改 修复方法是在组件中注入EventReplayer:
从'preboot'导入{EventReplayer};
构造函数(
@注入(平台ID)私有平台ID:any,
私有重放层:EventReplayer
)
然后重播预引导事件:
ngAfterViewInit(){
if(isPlatformBrowser(this.platformId)){
// ....
//在这里操纵您的DOM
// ....
this.replayer.replayAll()
}
}