2014-05-08 8 views
10

Sono un principiante ad angolare. Voglio usare $ timeout di angolare per aggiornare l'ambito dopo pochi minuti. Sto lavorando a un'app social in cui ho bisogno di aggiornare l'ambito di notifica dopo pochi minuti. Ricevere notifiche da una richiesta http utilizzando il servizio.

JS:

App.factory('MyService' ,function($scope,$timeout){ 
return{ 
notification:return function(callback){ 
     $timeout(function(){ 
     $http.get("notification/get").success(callback) 
     },100000); 


} 
}); 

function Controller($scope,MyService){ 

MyService.notification(function(result){ 
    $scope.notification =data; 
}); 

}

Ora come posso fare richiesta http dopo pochi minuti let'say 1 minuto e aggiornare la portata di notifica. Ho provato a usare $ timeout ma le cose non stanno andando bene.

risposta

26

Ma vorrei suggerire di spostare il $interval al controller.

App.factory('MyService' ,function($scope,$timeout){ 
    return{ 
    notification: function(){ 
     return $http.get("notification/get").success(function(response){ 
      return response.data; 
     });   
    } 
    }); 

function Controller($scope,MyService,$interval){ 

    /** 
    * Loads and populates the notifications 
    */ 
    this.loadNotifications = function(){ 
     MyService.notification().then(function(data){ 
     $scope.notification =data; 
     }); 
    }); 
    //Put in interval, first trigger after 10 seconds 
    var theInterval = $interval(function(){ 
     this.loadNotifications(); 
    }.bind(this), 10000);  

    $scope.$on('$destroy', function() { 
     $interval.cancel(theInterval) 
    }); 

    //invoke initialy 
    this.loadNotifications(); 
} 

Questa sembra un'architettura migliore lì.

Il passaggio, la risoluzione o il rifiuto delle promesse comporterà il numero $digest. Si desidera ottenere le notifiche ogni x millisecondi e passarle nello scope.

+0

Come possiamo effettuare la prima chiamata sul caricamento della pagina e poi va oltre dopo diciamo 10 sec. ? –

+7

Ricordare che è necessario annullare manualmente l'intervallo: '$ scope. $ On ('$ destroy', function() {$ interval.cancel (theInterval)})' – Pylinux

+0

Spostarsi su socket Web sarebbe meglio, piuttosto che tirare, puoi inviare al cliente https://github.com/wilk/ng-websocket –

1

Si desidera creare un'istanza per il timeout al termine. Prova a cambiare la tua funzione $ timeout a qualcosa del tipo:

var timer = $timeout(function refresh(){ 
    $http.get("notification/get").success(callback) 
    timer = $timeout(refresh, 100000); 
}, 100000); 
+0

Come possiamo effettuare la prima chiamata al caricamento della pagina e poi va oltre dopo diciamo 10 sec. ? –