Angular 4 - 如何正确拆除应用程序?

kub*_*003 9 angular

我需要从网站上删除当前运行的Angular应用程序,我试图通过删除HTML应用程序节点来实现这一点.然而,我最近发现了这样做的副作用,即一些没有删除Angular安装的回调.

那么拆除Angular 4应用程序的正确方法是什么?

我正在使用的当前方法似乎不正确:

function tryRemoveApplicationNode() {
  const currentApplicationNode = document.getElementsByTagName('ngk-app')[0];
  if (currentApplicationNode) {
    const parent = currentApplicationNode.parentNode;
    parent.removeChild(currentApplicationNode);
  }
}
Run Code Online (Sandbox Code Playgroud)

Pie*_*Duc 3

首先你需要这个@angularclass/hmr包:

npm install @angularclass/hmr
Run Code Online (Sandbox Code Playgroud)

这让你的生活变得更轻松一些。

您应该在模块的调用中调用destroy您的方法,然后使用包的方法。您可以尝试将其作为函数:AppModuledisposehotcreateNewHosts@angularclass/hmrhmrBootstrap

import {createNewHosts} from '@angularclass/hmr';
import {ApplicationRef, NgModuleRef} from '@angular/core';

export const hmrBootStrap: Function = async (): Promise<void> => {
    module['hot'].accept();
    const ngModule: NgModuleRef<AppModule> = await bootstrap();
    module['hot'].dispose(() => {
        const makeVisible: () => void = createNewHosts(
            ngModule.injector.get(ApplicationRef).components.map(
                c => c.location.nativeElement
            )
        );
        ngModule.destroy();
        makeVisible();
    });
};
Run Code Online (Sandbox Code Playgroud)

bootstrap并有一个像这样定义的普通方法:

export const bootstrap: any = (): Promise<NgModuleRef<AppModule>> => {
    return platformBrowserDynamic().bootstrapModule<AppModule>(AppModule);
};
Run Code Online (Sandbox Code Playgroud)

作为(部分)main.ts你可以这样:

if (module.hot) {
    hmrBootStrap();
} else {
    bootstrap();
}
Run Code Online (Sandbox Code Playgroud)