2014-02-05 56 views
0

我使用ngRoute,具有以下配置:使用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); 

最後,我啓動我的應用程序,並從廠景瀏覽3次視圖2。在此之後,每一秒,我得到以下日誌:

Test Controller, id: 00A 
Test Controller, id: 00I 
Test Controller, id: 00E 

如果我的測試情況下是不相關的,請告訴我。

我的問題:當ngRoute實例化一個新的控制器時,舊的控制器是被刪除還是仍在內存中?如果是這樣,我可以配置ngRoute重新使用相同的控制器還是破壞舊的?

回答

1

$scope.$id不是控制器的id,而是範圍。

當您打開使用$routeProvider定義的新頁面時,AngularJS「實例化」新控制器(即調用內部方法instantiate)。該方法調用控制器的功能new,因此它創建新的對象。但並不是所有的AngularJS都這樣。在用new調用控制器的構造函數之前,AngularJS解決了它的所有依賴關係。如果控制器具有稱爲$scope的本地依賴性,AngularJS將創建新的$scope,每個範圍都有唯一的標識符 - $scope.$id

當然,爲了防止內存泄漏,AngularJS不會在內存中保留舊的控制器,所以您不應該擔心這一點。

+0

哦!你是對的,這是範圍id ^我正在考慮它,並很快回來驗證或添加問題。謝謝 – Nicolas

+0

我很高興我幫助:) –

+0

那麼,舊的控制器的範圍保存?即使它不再與控制器連接? – Nicolas

相關問題