【发布时间】:2015-07-22 13:43:44
【问题描述】:
我有一个添加到表单的指令,我需要知道何时从 DOM 中删除表单。我正在尝试使用 $destroy 事件来检测它,但是当我在元素上调用 .remove() 时,不会触发 $destroy 事件。
我做错了吗?是否有正确的方法来判断它何时从 DOM 中删除?
相关代码:
HTML:
<form id="myform" form-watch>
在控制器中:
var form = document.getElementById('myform');
// DOES NOT trigger $destroy
form.remove();
// DOES trigger $destroy
//angular.element(form).scope().$destroy();
指令:
app.directive('formWatch', function () {
return {
restrict: 'A',
link: function(scope, element) {
scope.$on('$destroy', function() {
alert('destroyed');
});
}
};
});
这是plunker
编辑:这是我正在使用的更准确的图片:new plunker
【问题讨论】:
-
需要意识到在这种情况下范围是控制器范围,因为指令没有使用隔离范围。控制器仍然处于活动状态,因此删除元素不会破坏控制器范围。另外为什么不使用
ng-if而不是操纵DOM?控制器中不应该有任何 dom 操作代码。你到底想做什么? -
注明。本质上,该应用程序到处都有可点击的组件,单击一个会用一个值(在表单中)替换只读显示以提交更改。我正在使用这个 form-watch 指令来跟踪页面范围的“编辑”状态。如果某些原因导致表单被删除,我需要知道我不再编辑。
-
更有理由使用范围模型或 $state 来控制该 dom 元素的存在。如果你自己在做这种 dom 操作,那就大错特错了
-
在我的辩护中,这是别人的错误。你能通过使用范围模型来扩展你的意思吗?
-
简单示例...表单在自己的控制器中,但也可以是具有隔离范围的指令,也可以是嵌套视图plnkr.co/edit/V4jVMWBO4ifsiIn6kE0v?p=preview
标签: javascript angularjs dom