2015-06-19 56 views
-1

在我的下面的示例中,您可以看到,每次進入一個頁面時,都會創建一個具有不同ID的新實例,而舊的實例不會被銷燬, setIntervat方法會在所有這些方法上記錄相應的作用域ID和水果名稱。比方說,我有一個ajax調用,而不是日誌,它不時刷新頁面的內容,但我不想打電話給不活動的頁面,我該如何解決這個問題?創建相同控制器的角度多個實例

example

var app = angular.module('plunker', ['ngRoute']); 

app.config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
    .when('/fruit/:fruitId', { 
     templateUrl: 'fruit-tpl.html', 
     controller: 'FruitController' 
    }) 
    .otherwise({ 
     redirectTo: '/fruit/1' 
    }); 
}]); 

app.controller('FruitController', ['$scope', '$routeParams', 
    function($scope, $routeParams) { 
    var fruitArr = ['Lemons', 'Oranges', 'Grapefruit'], 
     fruitId = $routeParams.fruitId - 1; 

    $scope.fruitName = fruitArr[fruitId]; 

    setInterval(function() { 
     console.log('scope', $scope.$id, $scope.fruitName); 
    }, 3000); 
    } 
]); 
+0

setInterval不會消失當然是因爲你沒有阻止它。並且,直到你停止它,它使用的變量不能被垃圾收集。 –

回答

0

的setInterval不會當一個控制器被破壞無法得到自動停止,直到被停止,這些變量通過傳遞給它會留在記憶封閉封閉。即使你切換到$interval,同樣的問題仍然存在。

注意:使用此服務創建的間隔必須在完成時明確銷燬。特別是當控制器的作用域或指令的元素被銷燬時,它們不會被自動銷燬。你應該考慮到這一點,並確保在適當的時候總是取消間隔。有關如何以及何時執行此操作的更多詳細信息,請參閱下面的示例。

var theInterval = setInterval(function() { 
    console.log('scope', $scope.$id, $scope.fruitName); 
}, 3000); 
$scope.$on('$destroy', function() { 
    // Make sure that the interval is destroyed too 
    clearInterval(theInterval); 
}); 
相關問題