angularjs – Angular和Typescript内存泄漏

在使用TypeScript 0.9.1应用程序的AngularJS 1.2.5中,我们看到当我们更改路由时,控制器类上的私有方法保留在堆中,并在chromes探查器中保留分离的DOM树.

如果我们将/#/ view1导航到/#/ view2并返回到/ 3 / view1,我们最终会在堆中使用view1控制器类两次,并在堆中使用view2控制器类.

我们的解决方法是不再使用私有方法.

代码通常如下所示:

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中使函数私有,请参考:

 
http://javascript.crockford.com/private.html

从上面的代码我认为代码:

private changeTabToNew(): void {
    this.$scope.TrackingTab = "new"
}

只是在全局(或根)范围上创建函数changeTabToNew()(私有关键字没有你期望的btw效果).由于这不是控制器中存在的范围的一部分,因此您在全局范围内创建对“TrackingTab”的引用,因此无法对控制器进行垃圾回收.

点赞