在使用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”的引用,因此无法对控制器进行垃圾回收.