javascript - 从 DOM 中删除元素时,不会调用 $destroy

标签 javascript angularjs dom

我有一个添加到表单中的指令,我需要知道表单何时从 DOM 中删除。我尝试使用 $destroy 事件来检测它,但是当我在元素上调用 .remove() 时,不会触发 $destroy 事件。

我这样做错了吗?有没有正确的方法来判断它何时从 DOM 中删除?

相关代码:

HTML:

<form id="myform" form-watch>

在 Controller 中:

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

最佳答案

我不太确定您真正关心的是实际的销毁事件本身,而是应用程序中了解表单何时存在或不存在的一种方式。

这应该通过应用程序中的 Controller 和服务进行监控。

我认为问题是存在不应该存在的 dom 操作...通过使用适当的范围模型并设计仅由范围模型驱动的 View ,Angular 应该完成几乎所有的 dom 操作,如果不是全部的话。

以下示例通过将表单包装在其自己的 Controller 中并使用 ng-if 和作用域变量来确定表单是否存在来实现您想要的警报:

app.controller('MainCtrl', function($scope) {
  $scope.showForm = true;
});

app.controller('FormCtrl', function($scope) {
  $scope.$on('$destroy', function() {
    alert('destroyed');
  });
});

HTML:

<body ng-controller="MainCtrl">
  <!-- form has it's own controller -->
  <form ng-if="showForm" ng-controller="FormCtrl"></form>

 <!-- button in MainCtrl scope -->
 <button ng-click="showForm = !showForm">Toggle form</button>

每当表单被 ng-if 删除时,FormCtrl 作用域就会被销毁,并且 $destroy 事件就会被触发。然而,观察决定表单存在的作用域变量可能正是您真正想要的

DEMO

关于javascript - 从 DOM 中删除元素时,不会调用 $destroy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31564936/

相关文章:

javascript - Angular 日期选择器不触发 ng-change

jquery - 从 ajax Spring MVC Controller 方法执行正常重定向

javascript - 将数字添加到 DOM 元素 jquery 的最有效/最快捷的方法

关闭html标签后javascript读取html评论

javascript - 如何在 jquery 中使用函数调用创建缩放效果

javascript - jQuery .html 不显示元素名称

angularjs - 如何从路由器请求中获取值(value)?

dom - 返回具有 id 属性集的所有节点的 xpath 查询

javascript - 使用 javascript 的替换通配符来更改字符串内的宽度属性

javascript - 如何使空白区域可单击以显示文本?