angularjs - Angular 和 Typescript 内存泄漏

标签 angularjs memory-leaks typescript

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

相关文章:

javascript - 尝试使用 Javascript/Angular 在第一次出现的字符下划线

javascript - 当前浏览器中的闭包和 (jQuery) DOM 事件导致内存泄漏?

ios - 仪器中存在内存泄漏的类

javascript - SolidJS 中的条件样式

AngularJS 指令动态模板

javascript - 使用 D3.js 的实时图表

javascript - $window 在 AngularJS 中滚动时不会触发

iphone - UIImageView 内存泄漏崩溃问题 - Objective C

javascript - 使用 typescript 渲染 react 组件而不传递强类型 Prop

javascript - Angular 2 测试版即 10 "Potentially unhandled rejection [3] SyntaxError: Expected"