2015-06-19 57 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); 
}); 
相关问题