Je fais une démo dans laquelle je récupère les données du serveur après des intervalles de temps réguliers en utilisant $interval
Maintenant, je dois arrêter/annuler ceci.
Comment je peux y arriver? Si je dois redémarrer le processus, comment dois-je le faire?
Deuxièmement, j'ai une autre question: Je récupère les données du serveur après des intervalles de temps requis. Est-il nécessaire d'utiliser $scope.apply
ou $scope.watch
?
Voici mon plunker:
app.controller('departureContrl',function($scope,test, $interval){
setData();
$interval(setData, 1000*30);
function setData(){
$scope.loading=true;
test.stationDashBoard(function(data){
console.log(data);
$scope.data=data.data;
$scope.loading=false;
//alert(data);
},function(error){
alert('error')
}) ;
}
});
Vous pouvez stocker la promesse renvoyée par l'intervalle et utiliser $interval.cancel()
pour cette promesse, ce qui annule l'intervalle de cette promesse. Pour déléguer le début et la fin de l'intervalle, vous pouvez créer des fonctions start()
et stop()
chaque fois que vous souhaitez les arrêter et les redémarrer à partir d'un événement spécifique. J'ai créé un extrait ci-dessous montrant les principes de base du démarrage et de l'arrêt d'un intervalle, en l'implémentant en vue à travers l'utilisation d'événements (par exemple, ng-click
) et dans le contrôleur.
angular.module('app', [])
.controller('ItemController', function($scope, $interval) {
// store the interval promise in this variable
var promise;
// simulated items array
$scope.items = [];
// starts the interval
$scope.start = function() {
// stops any running interval to avoid two intervals running at the same time
$scope.stop();
// store the interval promise
promise = $interval(setRandomizedCollection, 1000);
};
// stops the interval
$scope.stop = function() {
$interval.cancel(promise);
};
// starting the interval by default
$scope.start();
// stops the interval when the scope is destroyed,
// this usually happens when a route is changed and
// the ItemsController $scope gets destroyed. The
// destruction of the ItemsController scope does not
// guarantee the stopping of any intervals, you must
// be responsible for stopping it when the scope is
// is destroyed.
$scope.$on('$destroy', function() {
$scope.stop();
});
function setRandomizedCollection() {
// items to randomize 1 - 11
var randomItems = parseInt(Math.random() * 10 + 1);
// empties the items array
$scope.items.length = 0;
// loop through random N times
while(randomItems--) {
// Push random number from 1 - 10000 to $scope.items
$scope.items.Push(parseInt(Math.random() * 10000 + 1));
}
}
});
<div ng-app="app" ng-controller="ItemController">
<!-- Event trigger to start the interval -->
<button type="button" ng-click="start()">Start Interval</button>
<!-- Event trigger to stop the interval -->
<button type="button" ng-click="stop()">Stop Interval</button>
<!-- display all the random items -->
<ul>
<li ng-repeat="item in items track by $index" ng-bind="item"></li>
</ul>
<!-- end of display -->
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
var interval = $interval(function() {
console.log('say hello');
}, 1000);
$interval.cancel(interval);
var promise = $interval(function(){
if($location.path() == '/landing'){
$rootScope.$emit('testData',"test");
$interval.cancel(promise);
}
},2000);
$scope.toggleRightDelayed = function(){
var myInterval = $interval(function(){
$scope.toggleRight();
},1000,1)
.then(function(){
$interval.cancel(myInterval);
});
};
Lorsque vous souhaitez créer une promesse de magasin d'intervalle à variable:
var p = $interval(function() { ... },1000);
Et quand vous voulez arrêter/effacer l'intervalle, utilisez simplement:
$interval.cancel(p);