我需要从网站上删除当前运行的Angular应用程序,我试图通过删除HTML应用程序节点来实现这一点。但是我最近发现了这样做的副作用,即没有删除Angular安装的一些回调。
什么是拆除Angular 4应用程序的正确方法?
我正在使用的当前方法似乎不正确:
function tryRemoveApplicationNode() {
const currentApplicationNode = document.getElementsByTagName('ngk-app')[0];
if (currentApplicationNode) {
const parent = currentApplicationNode.parentNode;
parent.removeChild(currentApplicationNode);
}
}
答案 0 :(得分:3)
首先,您需要@angularclass/hmr
包:
npm install @angularclass/hmr
这会让你的生活更轻松。
您应该在destroy
模块的AppModule
调用中致电dispose
上的hot
,之后使用createNewHosts
@angularclass/hmr
方法包。您可以尝试将此作为hmrBootstrap
函数:
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();
});
};
并且正常bootstrap
方法定义如下:
export const bootstrap: any = (): Promise<NgModuleRef<AppModule>> => {
return platformBrowserDynamic().bootstrapModule<AppModule>(AppModule);
};
作为(部分)main.ts
你可以拥有:
if (module.hot) {
hmrBootStrap();
} else {
bootstrap();
}
答案 1 :(得分:1)
正确拆卸应用程序所需的唯一内容是:
//save the NgModuleRef for later
let applicationModule = await platformBrowserDynamic().bootstrapModule(AppModule);
//when it's time:
applicationModule.destroy();
我的答案基于@PierreDuc显示的方向,但不涉及任何类型的HMR。把它放在这里只是为了记录。