我正在AngularJS中开发一个非常大的应用程序,为避免内存泄漏,我们正在$onDestroy
方法中实现内存释放,问题是有些变量变成了undefined
,ng-change
事件始终来自HTML,并且出现了一些错误。有什么办法可以断开所有HTML与控制器的连接?还是至少停止所有来自前端的事件?我正在使用AngularJS 1.6。
这是我如何定义组件的示例:
function requestListController($uibModal, urlRest, $stateParams, $state, uiGridConstants, $filter, httpService) {
var ctrl = this;
ctrl.$onInit= function() {
// ALL DATA INITIALIZATION
ctrl.requestListGridOptions.data = [];
// GETTING EXTERNAL DATA
httpService.get(url, true)
.then(function(response){
console.log("initRequestList - data.RequestListTO : " , response.RequestListTO);
angular.copy(response.RequestListTO.requests, ctrl.requestListGridOptions.data);
}) .catch(function onError(response) {
// Handle error
var status = response.status;
console.log("initRequestList - error : " + status);
});
};
//////////////////////////////
// //
// on$Destroy method //
// //
//////////////////////////////
ctrl.$onDestroy = function() {
ctrl.status=undefined;
ctrl.requestListGridOptions=undefined;
};
// OTHER METHODS
};
//Inject dependencies
requestListController.$inject = [ '$uibModal', 'urlRest', '$stateParams', '$state', 'uiGridConstants', '$filter', 'httpService'];
pomeApp.component('requestList', {
templateUrl: 'request/requestList/requestList.template.html',
controller: requestListController
});
这少了我的组件的结构。
答案 0 :(得分:2)
我猜您误解了onDestroy
事件。主要是为了删除$rootScope.$on(...)
的超时,时间间隔或事件。
ng-change事件绑定到范围。这意味着如果删除范围,它将自动销毁。因此整个范围不会被破坏,您还有另一个问题。
如果您的一个大型应用程序具有一个范围或类似的范围,则应使用ng-if
删除不应显示的部分。如果ng-if
的变量为false,这将删除DOM元素以及所有观察者。
没有任何合适的代码,没有人能真正为您提供帮助,只是猜测您的问题可能是什么。
答案 1 :(得分:0)
您首先需要查看已订阅多少个事件。然后,在销毁操作中,您可以取消订阅所有这些事件。有时,我们还会使用必须销毁的指令。或者这些指令中有一些逻辑需要清除。另外,如果您已订阅了根作用域上的任何事件,则即使本地作用域已被破坏,事件也将保留。