javascript - Angular .js : using events to trigger actions in controllers might cause memory leak

标签 javascript angularjs angularjs-scope angular-ui-router

我的申请结构如下: - 带有搜索框和按钮的静态标题 - 标题中的菜单,可在 View 之间切换 - 在此之下,一个带有 ng-view 的 div; View 通过 routeProvider 打开菜单点击

当用户单击标题中的搜索按钮时,所有 View Controller (通过 routeProvider 分配)应该从共享服务加载一些数据。我使用事件实现了这个。在我的搜索表单 Controller 中:

$scope.search = function () {
        DataStore.load($scope.searchFormState.someSearchParam, $scope.searchFormState.anotherSearchParam);
        $scope.$emit('searchForm:search');
    }

在我的 Controller 中,我监听该事件并加载一些数据:

$scope.systemListener = $rootScope.$on('searchForm:search', function () {
        DataStore.promises.somePromise.then(function () {
            $scope.myDataArray = DataStore.data.dataArrayFromService;
        });
    });

然后,在我的 Controller 中,我监听销毁事件:

    $scope.$on('$destroy', function () {
        $scope.systemListener();
    });

一切正常,但是当我在菜单中四处点击时,我注意到我的 js 堆增长很快。我怀疑某处存在内存泄漏。这可能与我的 Controller 的范围没有被正确地垃圾收集有关吗?我需要在我的析构函数中做任何其他事情吗?

最佳答案

如果您的 Controller 中有任何观察者,您可能希望在 $destroy 监听器中取消观察它们。 喜欢`

var $unwatch = scope.$watch(something, somethingElse);

$scope.$on('$destroy', function () {
    $unwatch();
});

此外,我建议不要在代码中使用 $scope.$$listener = [];,至少因为 $$listener 是 angularjs 的局部变量,它的名称可能会随着即将推出的 angular 版本而改变。

关于javascript - Angular .js : using events to trigger actions in controllers might cause memory leak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312580/

相关文章:

javascript - 在 JavaScript 中组织扩展方法的最佳实践

javascript - 单击选项卡后,Angular Bootstrap 选项卡更改 url

html - ng-required 输入后的红色星号(无标签)

javascript - 了解 AngularJS $resource() 返回什么(类或实例对象)

javascript - 如何在 Controller 加载之前加载数据?

javascript - 如何使状态可迭代并解析 "Unhandled Rejection (TypeError): state.story is not iterable"?

javascript - 如何从 Google 版本 map 中拖动的标记获取格式化地址

javascript - Firefox 中的 Angular2 变化检测无限循环

javascript - 如何使用 href 文本调用 ng-click 中的表单函数?

javascript - angular.js 显示模糊后的解析值