在使用 TypeScript 0.9.1 应用程序的 AngularJS 1.2.5 中,我们看到当我们更改路由时, Controller 类上的私有(private)方法保留在堆中,并在 chrome 分析器中留下分离的 DOM 树。
如果我们将/#/view1 导航到/#/view2 并返回到/3/view1,我们最终会在堆中获得两次 view1 Controller 类,并在堆中获得 view2 Controller 类。
我们的解决方法是不再使用私有(private)方法。
代码大致如下:
module views {
app.controller("view1Ctrl", function($scope, $routeParams) {
return new view1Ctrl($scope, $routeParams);
});
interface Scope extends ng.IScope {
TrackingTab: any;
}
class view1Ctrl {
constructor(private $scope: Scope, $routeParams: any) {
$scope.TrackingTab = $routeParams["tab"];
$scope.$watch("showTab", (newValue: TrackingTab): void => {
if (newValue === undefined) return;
});
}
private changeTabToNew(): void {
this.$scope.TrackingTab = "new"
}
}
}
我们必须更改为以下内容:
module views {
app.controller("view1Ctrl", function($scope, $routeParams) {
return new view1Ctrl($scope, $routeParams);
});
interface Scope extends ng.IScope {
TrackingTab: any;
}
class view1Ctrl {
constructor(private $scope: Scope, $routeParams: any) {
$scope.TrackingTab = $routeParams["tab"];
$scope.$watch("showTab", (newValue: TrackingTab): void => {
if (newValue === undefined) return;
});
$scope.changeTabToNew(): void {
this.$scope.TrackingTab = "new"
};
}
}
提前致谢
最佳答案
如果想在javascript中将函数设为private,请引用: http://javascript.crockford.com/private.html
从上面的代码我认为代码:
private changeTabToNew(): void {
this.$scope.TrackingTab = "new"
}
只是在全局(或根)范围内创建一个函数 changeTabToNew()(顺便说一下,private 关键字没有达到您预期的效果)。由于这不是 Controller 中存在的范围的一部分,您正在全局范围内创建对“TrackingTab”的引用,因此无法对 Controller 进行垃圾回收。
关于angularjs - Angular 和 Typescript 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20689360/