如果 DOM 元素被“删除”,AngularJS 控制器会被破坏?

Posted

技术标签:

【中文标题】如果 DOM 元素被“删除”,AngularJS 控制器会被破坏?【英文标题】:AngularJS Controller gets destroyed if the DOM element gets "removed"? 【发布时间】:2016-03-09 18:15:47 【问题描述】:

我有一个附加到 angularjs 控制器的指令,类似于

<my-directive id="my-unique-directive" ng-controller="MyController"></my-directive>

在我的控制器中,在某些时候我需要这个指令消失。然后我在其中混入了一些 jQuery,这样我就可以$('#my-unique-directive').remove();

它工作正常,但我这样做正确吗?我知道您不应该访问控制器内的 DOM 元素,但我还能如何实现这个结果?

为了测试我的控制器是否被破坏,我设置了一个函数,该函数将每隔一秒 console.log('I'm still here');,并且在我删除 DOM 元素后立即调用该函数。 (另外,该函数附加到控制器本身,而不是 $scope)

这证实了我的担忧:控制器没有被销毁,即使在指令被删除后日志仍然显示。

销毁 DOM 元素后如何销毁控制器?

【问题讨论】:

不确定你对这个控制器有什么看法?真的需要销毁吗?首先不要使用 jQuery,也许使用 ng-if="dontShowMe" 是的,ng-if 会为你完成这项工作plnkr.co/edit/t0MZrSmeAD0BQVKW9RVw?p=preview 我认为如果我要在另一个地方重复使用我创建的姿势,我需要破坏它 【参考方案1】:

ng-if 将为您完成这项工作:

<my-directive id="my-unique-directive" ng-controller="MyController" ng-if="!isDeleted"></my-directive>

只需将 isDeleted 设置为 true 即可删除元素和相关范围。

注意: 如果您将控制器存储到某个变量,它将不会被破坏。 (因为垃圾收集器将无法收集它) 如果你使用 $timeout(console.log('I am here'), 1000) - 它仍然会被执行。 但这并不意味着控制器存在。

【讨论】:

由于 Java、Pascal 等原因,我习惯于销毁我创建的每个对象的每个实例。我认为同样的规则也适用于此......在我“ng-if”这个指令之后,我会在另一个地方创建同样的东西,那还是没问题的吧?

以上是关于如果 DOM 元素被“删除”,AngularJS 控制器会被破坏?的主要内容,如果未能解决你的问题,请参考以下文章

如果你删除了一个 DOM 元素,任何以该元素开始的事件是不是会继续冒泡?

有没有办法检测 DOM 节点何时要从 DOM 中删除?

angularJS指令系统---Directive

AngularJS 指令 DOM 操作不起作用

AngularJs 使元素在 DOM 中可动态拖动或放置

AngularJS 动态元素 ID 和 DOM 访问