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

时间:2014-02-05 10:01:54

标签: angularjs memory controller routes

我正在使用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重新使用同一个控制器或破坏旧控制器吗?

1 个答案:

答案 0 :(得分:1)

$scope.$id不是控制器的id,而是范围的id。

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

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