Angularjs 使用ngRoute时,控制器是否重复?

Angularjs 使用ngRoute时,控制器是否重复?,angularjs,memory,controller,routes,Angularjs,Memory,Controller,Routes,我使用的是ngRoute,配置如下: myApp.config(['$routeProvider', function($routeProvider) { $routeProvider .when('/view1', { controller:'my1Ctrl', templateUrl:'views/view1.html' }) .when('/view2', { controller:'my2Ctrl', templ

我使用的是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和view2之间导航了3次。之后,每秒钟,我都会得到以下日志:

Test Controller, id:  00A
Test Controller, id:  00I
Test Controller, id:  00E
如果我的测试用例不相关,请告诉我


我的问题:当ngRoute实例化一个新控制器时,旧控制器是已删除还是仍在内存中?如果是,我是否可以将ngRoute配置为重新使用同一个控制器或断开旧的控制器?

$scope.$id
不是控制器的id,而是作用域的id

当您打开用
$routeProvider
AngularJS“实例化”新控制器定义的新页面时(即调用内部方法
实例化
)。此方法使用
new
调用控制器的函数,以便创建新对象。但这并不是AngularJS所做的全部。在使用
new
调用控制器的构造函数之前,AngularJS会解析它的所有依赖项。如果控制器具有名为
$scope
AngularJS创建新的
$scope
,则每个作用域都具有唯一标识符-
$scope.$id


当然,为了防止内存泄漏,AngularJS不会将旧的控制器保留在内存中,所以您不必担心这一点。

噢!你说得对,这是范围id^^^我正在考虑,很快回来验证或添加问题。谢谢,旧控制器的范围保留了吗?即使它不再与控制器链接?不,它不是,当您离开页面时,控制器的
$scope
也会被垃圾收集。因此,是我的setTimeout绑定造成了这种效果。这项测试不相关。谢谢,如果您一直引用
$scope
它没有被垃圾收集,这是内存泄漏的常见原因。