2014-01-09 3 views
53

ich mehrere $timeout Ausdrücke in Modal-Controller haben

App.controller('ModalCtrl', function ($scope, $timeout) { 
    for (var i = 0; i < 10; i++) { 
     (function() { 
      var timer = $timeout(function() { 
       console.log('timer') 
      }, 1000); 
     })() 
    } 
}) 

Ich brauche alle Timer zu löschen, wenn die modale Aufruf:

App.controller('MainCtrl', function ($scope, $modal, $timeout) { 
    $scope.showMap = function() { 
     var modal = $modal.open({ 
      templateUrl: 'modalap.html', 
      controller: 'modalCtrl', 
     }) 

     modal.result.then(function() { //fires when modal is resolving 
     }, function() { //fires when modal is invoking 
     }); 
    } }) 

Wie kann ich das tun ?

PS Entschuldigung für fehlerhafte Codeformatierung. Ich weiß nicht warum, aber ich kann es nicht besser formatieren. Ich kopierte Code here:

+0

wie kann man einen Controller wie das injizieren? –

Antwort

117

Der $ Timeout-Dienst gibt ein Versprechen-Objekt zurück, mit dem das Zeitlimit abgebrochen werden kann.

Um alle ausstehenden Timeouts abzubrechen, müssen Sie eine Liste der Versprechungen verwalten und die vollständige Liste abbrechen, wenn Sie das Modal öffnen.

2

Sie können auch, indem Sie diese sie heben sich lassen ...

(function(){ 
    var timer = $timeout(function(){ 
    console.log(timer.$$timeoutId); 
    $timeout.cancel(timer); 
    }, 1000); 
})(); 
+11

Das ergibt für mich keinen Sinn. Warum würden Sie ein '$ timeout ', das bereits aufgerufen wurde, abbrechen? – pixelfreak

+0

Ich frage mich, ob Angular Zuhörer auf diese Auszeit hält. Es sieht so aus, weil, wenn Sie viele Timeouts aufrufen, das Gedächtnis wächst und schließlich zu einem Memory-Lauch führt. –

+0

Ich nehme an, Sie könnten das tun. – Matt