我正在使用ngRoute,具有以下配置:
myApp.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/view1', {
controller:'my1Ctrl',
templateUrl:'views/view1.html'
})
.when('/view2', {
controller:'my2Ctrl',
templateUrl:'views/view2.html'
});
}])
出于本示例的目的,我每秒都记录控制器的ID。因此,在my1Ctrl控制器中,我添加以下代码:
$scope.f = function(){
console.log('Test Controller, id: ', $scope.$id);
setTimeout($scope.f, 1000);
};
setTimeout($scope.f, 1000);
最后,我启动了我的应用并从view1导航3次到view2。在那之后,每一秒,我得到以下日志:
Test Controller, id: 00A
Test Controller, id: 00I
Test Controller, id: 00E
如果我的测试用例不相关,请告诉我。
我的问题:当ngRoute实例化一个新的控制器时,旧的控制器被移除还是仍在内存中?如果是,我可以配置ngRoute重新使用同一个控制器或破坏旧控制器吗?
答案 0 :(得分:1)
$scope.$id
不是控制器的id,而是范围的id。
当您打开使用$routeProvider
AngularJS定义的新页面时,“实例化”新控制器(即调用内部方法instantiate
)。此方法使用new
调用控制器的函数,以便创建新对象。但并非所有AngularJS都这样做。在使用new
调用控制器的构造函数之前,AngularJS会解析它的所有依赖项。如果控制器具有名为$scope
的本地依赖关系,则AngularJS会创建新的$scope
,每个范围都有唯一标识符 - $scope.$id
。
当然,为了防止内存泄漏,AngularJS不会将旧控制器保留在内存中,因此您不必担心这一点。