我正在尝试创建一个实用程序方法,该方法将附加到AngularJS的$destroy
的{{1}}事件,以便它自动清理处理程序并避免内存泄漏。下面是一个名为$scope$
的实用程序方法的示例代码,它在TypeScript中,但应该与JavaScript非常相似。
attachEventToRootscopeAndRegisterUnbind()
我的问题是:
class EventToUnRegister {
public $scope: ng.IScope;
public unbindHandler: Function;
public eventName: string;
public logger: Core.ILog;
public onScopeDestroy() {
this.logger.debug("EventToUnRegister:onScopeDestroy",`Scope destroyed, unbinding event '${this.eventName}'`);
this.unbindHandler();
//remove references
this.logger = null;
this.unbindHandler = null;
this.$scope = null;
this.eventName = null;
}
}
attachEventToRootscopeAndRegisterUnbind($scope: ng.IScope, eventName: string, listener: (event: angular.IAngularEvent, ...args: any[]) => any) {
var eventToUnRegister = new EventToUnRegister();
eventToUnRegister.$scope = $scope;
eventToUnRegister.logger = this.logger;
eventToUnRegister.unbindHandler = this.$rootScope.$on(eventName, listener);
eventToUnRegister.eventName = eventName;
$scope.$on("$destroy", () => {
eventToUnRegister.onScopeDestroy(); //<-- IS IT AN ISSUE TO ACCESS THIS HERE?
eventToUnRegister = null; //remove reference to make sure it is cleaned up
});
}
事件处理程序访问eventToUnRegister
是否存在任何问题?最初的问题是,您出于任何原因附加到$scope.$on
上的事件的控制器。理想情况下,这没有完成,但有时需要它。然后,由于$rootscope
永远不会被销毁,控制器将因事件而永远存在。我正在尝试创建此实用程序方法来解决此问题。
答案 0 :(得分:1)
对我来说看起来非常有效,只要在$destroy
内没有发现相关事件链,我就不会发现任何问题。除此之外,您并不需要来明确地取消所有内容。如果对包含对象的引用超出范围(并且它的子属性都没有以某种方式返回引用),则该对象被垃圾回收。