指令范围导致孤立范围

时间:2014-03-12 17:50:03

标签: angularjs angularjs-directive

我正在使用AngularJS和Angular UI Bootstrap - Angular UI Bootstrap版本是旧的(0.4.0)。

我正在使用Modal指令。在模态体内,我有自己的指令,显示一个表格。

此表单指令具有控制器功能,可将表单提交给服务器。

模态有一个按钮,可以调用广播和事件的控制器功能(不同的控制器)。 Form控制器有一个偶数监听器,当事件被引发时,提交表单。

因此,总结一下,表单控制器有一个简单的函数来提交表单:

$scope.submitForm = function () {
    //Submit the form to the server
};

表单控制器还有一个事件处理程序

$scope.$on('submitEvent', function () {
    $scope.submitForm();
});

模态是另一个引发事件的控制器的一部分:

$scope.$broadcast('submitForm');

现在出现了问题。

每次打开模态时,我都会发现创建了一个新的范围(正如预期的那样,因为我有一个指令的隔离范围)。但是,一旦模态关闭,范围似乎就不会被破坏。

每次打开模态时,都会创建一个新范围。但之前的范围仍然存在。它基本上作为孤立范围存在 - 它不会影响新模态的新范围。

当模态控制器引发submitForm事件时,会出现问题。引发事件时,将触发所有事件侦听器。 因此,即使孤儿作用域上的事件侦听器也会多次触发提交空表单(打开模态的次数),最后激活最后一个活动作用域的事件侦听器,然后提交实际表单。

因此,我似乎没有绑定到任何模板的范围,但似乎在使用应用程序时会占用内存。

我的问题是没有正确调用submitForm函数 - 我只想知道如何处理孤立范围......

1 个答案:

答案 0 :(得分:2)

孤儿作用域的此类问题也存在于0.10版本中,应在下一版本中修复。

对于孤儿作用域,您可以通过模态控制器内的$scope.$destroy()手动删除它们。之后,所有模态范围侦听器都将处于非活动状态。删除还意味着当前范围符合垃圾收集的条件。

相关问题