Angular elementRef.nativeElement.remove()是否对浏览器有任何负面影响?

Angular elementRef.nativeElement.remove()是否对浏览器有任何负面影响?,angular,dom,Angular,Dom,我正在设置一个超时来销毁Angular 2上的组件,该组件可能会在调用超时之前销毁。不管用哪种方式调用超时,它都会对组件的本机元素执行.remove()(即使它不再在dom中) 如果元素被销毁,并且执行超时以删除已销毁的组件,是否存在任何不可见的负面影响 export class AnimationCloserComponent { public queryParams$; constructor( private router: Router,

我正在设置一个超时来销毁Angular 2上的组件,该组件可能会在调用超时之前销毁。不管用哪种方式调用超时,它都会对组件的本机元素执行.remove()(即使它不再在dom中)

如果元素被销毁,并且执行超时以删除已销毁的组件,是否存在任何不可见的负面影响

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()路由侦听和超时删除中执行两项操作。它尝试侦听路由指令(但如果没有收到任何路由指令,则不会执行任何操作),并有一个超时来删除路由指令,无论发生什么情况,它都会被调用。