我的申请结构如下: - 带有搜索框和按钮的静态标题 - 标题中的菜单,用于在视图之间切换 - 在下面,一个带有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堆快速增长。我怀疑某处存在内存泄漏。它可能与我的控制器的范围有关,而不是正确的垃圾收集?我是否必须在析构函数中执行任何其他操作?
答案 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)。 在我的特殊情况下,这不再是一个问题,因为我的应用程序已经完成了重写,现在内存消耗要好得多。