Angular elementRef.nativeElement.remove()是否对浏览器有任何负面影响?
我正在设置一个超时来销毁Angular 2上的组件,该组件可能会在调用超时之前销毁。不管用哪种方式调用超时,它都会对组件的本机元素执行.remove()(即使它不再在dom中) 如果元素被销毁,并且执行超时以删除已销毁的组件,是否存在任何不可见的负面影响Angular elementRef.nativeElement.remove()是否对浏览器有任何负面影响?,angular,dom,Angular,Dom,我正在设置一个超时来销毁Angular 2上的组件,该组件可能会在调用超时之前销毁。不管用哪种方式调用超时,它都会对组件的本机元素执行.remove()(即使它不再在dom中) 如果元素被销毁,并且执行超时以删除已销毁的组件,是否存在任何不可见的负面影响 export class AnimationCloserComponent { public queryParams$; constructor( private router: Router,
export class AnimationCloserComponent {
public queryParams$;
constructor(
private router: Router,
private elementRef:ElementRef,
private activatedRoute:ActivatedRoute) {}
ngOnInit() {
/* Will look for routing instructions with QueryParams to route and close this component. These instructions may sometimes not be available.. */
this.queryParams$ = this.activatedRoute
.queryParamMap
.map(params => {
let closeOutletName = params.get('closeOutlet') || null;
if (closeOutletName != null) {
this.router.navigate(['', { outlets: { [closeOutletName]: null }}]);
}
return params.get('closeOutlet') || null;
}
);
/* This is meant to destroy the component if the router could not route away from it. */
setTimeout(()=>{
this.elementRef.nativeElement.remove();
}, 1500);
}
}
在我练习之前,我真的想问一下这样做是否可以。(下面已经阐明)在不知道的情况下删除本机DOM元素几乎是不可能的。Angular将所有与组件相关的节点(包括子组件)保留在称为的抽象中。视图中的节点指向DOM元素。考虑以下设置:
ComponentA
ComponentB
视图层次结构如下所示:
ComponentAView
ElementNode('<b-comp>', document.createElement('<b-comp>'))
ComponentBView
...
ComponentClassNode(new ComponentB());
组件视图
ElementNode(“”,document.createElement(“”))
组件视图
...
ComponentClassNode(新的ComponentB());
如果从DOM中删除第一个元素
,则Angular对此一无所知。它将继续认为有一个子组件可用
这可能会导致意外的后果,例如在将子组件从DOM中删除时,在
@ViewChildren
中报告子组件。谢谢。我应该怎么做才能安全地移除组件?@Jonathan002,你能添加更多细节吗?为什么你需要它?我在项目中有一个微妙的动画设置,它依赖于动态加载的空组件。由于该组件经常使用,因此很难跟踪它将出现在何处。我可以通过各种方法移除它,例如路由。但是,在某些情况下,可能无法知道路线的位置。我有超时功能试图删除组件,以防无法进行路由。@Jonathan002,非常混乱,您在哪里调用setTimeout
?我在组件的ngOnInit调用它。该组件在ngOnInit()路由侦听和超时删除中执行两项操作。它尝试侦听路由指令(但如果没有收到任何路由指令,则不会执行任何操作),并有一个超时来删除路由指令,无论发生什么情况,它都会被调用。