如果 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 控制器会被破坏?的主要内容,如果未能解决你的问题,请参考以下文章