Angular Universal,如何将带有声明的模块与服务器端执行隔离?

时间:2018-11-06 10:12:06

标签: angular angular-universal angular-module ssr angular-dependency-injection

我已安装ng2-pdf-viewer以便在angular 6应用程序中显示文档。

要使其正常工作,我需要在要使用FeatureModule组件的<ng2-pdf-viewer>中导入PdfViewerModule。

问题出在PdfViewerModule中,它在其函数内调用Element和Window对象,并且在服务node server.js时会崩溃。

目前,我的模块是这样导入的:

BrowserModule > AppModule > FeatureModule > PdfViewerModule(declare <ng2-pdf-viewer>)

通常,我可以通过将特定的模块直接导入BrowserModule并为ServerModule提供一些定制创建的模拟模块来解决此类问题,这些模块可以声明相同名称的<ng2-pdf-viewer>模拟。 我考虑过的解决方案是将PdfViewerModule直接导入BrowserModule中,如下所示:

BrowserModule(imports PdfViewerModule) > AppModule > FeatureModule

但是在这种情况下,FeatureModule的组件无法访问其模板中的<ng2-pdf-viewer>,因为未声明。

是否可以将PdfViewerModule与服务器端执行隔离,但保留其声明? 也许在这种情况下绝对有不同的方法?

先谢谢您! :)

1 个答案:

答案 0 :(得分:0)

我认为这应该可以解决问题。

<ng2-pdf-viewer *ngIf="isBrowser"></ng2-pdf-viewer>

isBrowser: boolean;

constructor(@Inject(PLATFORM_ID) private platformId: string) {
   this.isBrowser = isPlatformBrowser(platformId);
}

*ngIf指令应阻止您的PDF渲染器执行

编辑:不起作用,因为浏览器javascript代码甚至在组件初始化之前(在模块声明中)就执行了

正如您已经想到的那样,您可以尝试根据自己的需要调整此解决方案Need BrowserAnimationsModule in Angular but gives error in Universal,您将有一个AppBrowserModule可以导入AppModule以及您将创建的另一个模块,它将包装PdfViewerModule,使用它的组件及其关联的路由。