Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在删除AngularJS中的DOM元素之前应该做什么?_Javascript_Angularjs_Dom_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Javascript 在删除AngularJS中的DOM元素之前应该做什么?

Javascript 在删除AngularJS中的DOM元素之前应该做什么?,javascript,angularjs,dom,angularjs-directive,angularjs-scope,Javascript,Angularjs,Dom,Angularjs Directive,Angularjs Scope,我记得听说在从DOM中删除某个元素之前需要销毁该元素的作用域。但我不确定这是怎么做到的 所以,碰巧我有一个从DOM中删除元素的指令。精简版的外观如下所示: (function() { angular.module('app').directive('remove', function() { return { restrict: 'A', link: function(scope, element, attrs) {

我记得听说在从DOM中删除某个元素之前需要销毁该元素的作用域。但我不确定这是怎么做到的

所以,碰巧我有一个从DOM中删除元素的指令。精简版的外观如下所示:

(function() {
    angular.module('app').directive('remove', function() {
        return {
            restrict: 'A',
            link: function(scope, element, attrs) {
                element.children().remove();
                element.remove();
            }
        }
    }]);
}());
一个简单而不实用的例子如下

我可以删除元素,但它似乎不会破坏作用域,我相信这会造成内存泄漏,对吗?我还在指令的控制器(具有隔离作用域的控制器)中设置了一个
$interval
,其中我设置了一条控制台消息作为测试发出。我可以看到,当它从DOM中删除时,它仍然会以设置的间隔注销控制台消息


我是否会修改上面指令中的某些内容以正确删除元素?

如果元素是从作用域生成的,则应该销毁它,删除作用域数据并让angular重新渲染,而不是使用DOM操作。作用域数据与DOM元素本身无关,元素只是基于作用域呈现的内容。因此,删除元素不会对范围变量产生任何影响


您不应该使用指令来执行此操作;改为更改或删除范围中的值。

您可以通过几个实验来尝试元素/范围销毁:

您可以进行测试,查看作用域何时被破坏,如下所示:

scope.$on('$destroy', function(){
    console.log('Scope Destroyed!');
});
您还可以测试正在销毁的元素:

element.on('$destroy', function(){
    console.log('Element Destroyed!');
});
(请参见第页的事件部分)

现在,关于间隔:

$interval
将一直运行,直到您
$interval.cancel()
调用它,无论作用域是否存在(除非回调是绑定到
作用域的某个函数,在这种情况下,回调可能会变为未定义,我不确定
$interval
如何处理)

如果您的指令正在运行
$interval
函数,则可能会出现以下情况:

var count = 0;
var timer = 
    $interval( function doingStuff () {
        console.log( count + ' seconds ...' );
    }, 1000 );

scope.$on('$destroy', function cleanup () {
    $interval.cancel( timer );
});
关于需要手动销毁作用域:


如果您通过
var myScope=$scope.$new()手动创建范围您有责任通过myScope.$destroy()销毁它。我想说这是一种更高级的用法,我想不出任何真正常见的手动创建新范围的原因。(如果您的指令是创建一个元素,并使用全新的作用域对其进行编译)

指令,例如
ng view
ng if
ng repeat
ng include
,等等。在DOM中添加元素时,首先创建一个子作用域,并在将这些元素附加到DOM之前,使用
$compile
服务编译这些元素并将其链接到该子范围。这些编译的元素链接到创建的子范围。当这些指令随后删除这些元素时,它们也会破坏子作用域

要创建子作用域,请执行以下操作:

var childScope = scope.$new();
childScope.$destroy();
要销毁该子作用域,请执行以下操作:

var childScope = scope.$new();
childScope.$destroy();
有关详细信息,请参阅