gpt4 book ai didi

angularjs - Angular 和 Typescript 内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-30 21:00:38 25 4
gpt4 key购买 nike

在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com