angular.js:使用事件触发控制器中的操作可能会导致内存泄漏

时间:2014-12-05 09:26:03

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

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

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

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

在我的控制器中,我会听取该事件并加载一些数据:

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

然后,在我的控制器中,我会听取破坏事件:

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

一切正常,但当我在菜单中点击时,我注意到我的js堆快速增长。我怀疑某处存在内存泄漏。它可能与我的控制器的范围有关,而不是正确的垃圾收集?我是否必须在析构函数中执行任何其他操作?

2 个答案:

答案 0 :(得分:0)

如果你的控制器中有任何观察者,你可能想要在$ destroy监听器中取消监视它们。 喜欢`

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

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

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

答案 1 :(得分:0)

事实证明,内存泄漏可能实际上是Chrome开发工具中的一个错误(详细信息可以在这里找到:https://github.com/angular/angular.js/issues/4864)。 在我的特殊情况下,这不再是一个问题,因为我的应用程序已经完成了重写,现在内存消耗要好得多。