我正在使用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函数 - 我只想知道如何处理孤立范围......
答案 0 :(得分:2)
孤儿作用域的此类问题也存在于0.10版本中,应在下一版本中修复。
对于孤儿作用域,您可以通过模态控制器内的$scope.$destroy()
手动删除它们。之后,所有模态范围侦听器都将处于非活动状态。删除还意味着当前范围符合垃圾收集的条件。