2016-02-22 11 views
22

che sto usando qui di seguito il codice, In laravel lamaCome applicare ritardo AngularJS

<div ng-show="displayErrorMsg" class="form-group m-b alert alert-danger">{{errorMsg}} 

In angularjs regolatore

$scope.errorMsg = "Data Empty"; 
$scope.displayErrorMsg = true; 
setTimeout(function() { $scope.displayErrorMsg = false;}, 2000); 

messaggio non scompare dopo 2 secondi automaticamente come data.

Ma quando metto semplicemente alert ("test"); o clicca ovunque il messaggio scompare. Come risolvere questo problema?

+0

Risposta a lungo termine, è necessario utilizzare il servizio angolare per consentire a angular sapere quando qualcosa è cambiato e aggiornare tutti 'scope's e view. ---- risposta breve, vai per la risposta di @Imtiaz Pabel o @searching ... e usa '$ timeout' :-) –

+0

Grazie a tutti, sta funzionando .. :) – Rita

risposta

30

Basta iniettare $timeout nel controller e utilizzarlo.

$timeout(function() { $scope.displayErrorMsg = false;}, 2000); 

Inoltre è possibile utilizzare $ digerire o $ applicare come di seguito

setTimeout(function() { 
    $scope.displayErrorMsg = false; 
    $scope.$digest(); 
}, 2000); 

setTimeout(function() { 
    $scope.$apply(function(){ 
     $scope.displayErrorMsg = false; 
    }); 
}, 2000); 

controllare qui come queste opere,

http://www.sitepoint.com/understanding-angulars-apply-digest/

3

Esempio 1: SetTimeout

var timerCount = function() { 
    setTimeout(function() { 
     $scope.displayErrorMsg = false; 
     $scope.$apply(timerCount); 
    }, 2000); 
} 

Esempio 2: $ timeout

$timeout(function() { 
    $scope.displayErrorMsg = false; 
}, 2000); 
1

setTimeout è metodo oggetto finestra. Quindi per accedere a questa funzione, iniettare $ finestra nel controllore. Quindi è possibile chiamare qualsiasi metodo come avviso, confermare, setTimeout, setInterval ecc
dettagli
https://docs.angularjs.org/api/ng/service/$window allora si può scrivere

$scope.errorMsg = "Data Empty"; 
$scope.displayErrorMsg = true; 
$window.setTimeout(function() { $scope.displayErrorMsg = false;}, 2000); 
2

è possibile iniettare $ timeout. Metodo window.setTimeout di Angular's warapper.

provare questo: -

$timeout(function() { $scope.displayErrorMsg = false;}, 2000); 

la struttura di $ timeout è synatx: - $ timeout (fn, ritardo, invokeAny, pass)

funzione Fn che si vuole ritardare

ritardo: - durata

invokeAny: - sarà impostato false per impostazione predefinita altrimenti chiamare funzione fN all'interno di $ ap blocco piega

pass: - è un parametro facoltativo per eseguire la funzione.

un altro approccio: -

setTimeout(function() { 
    $scope.$apply(function(){ 
     $scope.displayErrorMsg = false; 
    }); 
}, 2000); 

il metodo setTimeout corsa fuori contesto angolare così abbiamo bisogno di chiamare $ applicare che chiamerà $ digerire ciclo perché se aggiorniamo $ portata all'interno setTimeout angolare bisogno di sapere $ scope si sporca.

1

Improved Soluzione 1:

$scope.errorMsg = "Data Empty"; 
$scope.displayErrorMsg = true; 
if (timer) $timeout.cancel(timer); // restart counter 
timer = setTimeout(function() { $scope.displayErrorMsg = false;}, 2000); 

Soluzione 1:

È possibile utilizzare $timeout:

$scope.errorMsg = "Data Empty"; 
$scope.displayErrorMsg = true; 
setTimeout(function() { $scope.displayErrorMsg = false;}, 2000); 

Soluzione 2:

Con setTimeout:

setTimeout(function() { 
    $scope.$apply(function(){ 
     $scope.displayErrorMsg = false; 
    }); 
}, 2000); 
2

Di solito ho bisogno di una funzione per attendere un po 'per qualsiasi motivo, a scopo di prova solo. In Java, possiamo usare Thread.sleep(). Tuttavia, In JavaScript preferisco usare una semplice funzione che ho trovato here:

function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i < 1e7; i++) { 
    if ((new Date().getTime() - start) > milliseconds){ 
     break; 
    } 
    } 
} 

E ha lavorato per me in diversi scenari, tra cui AngularJS. Ma, per favore, ricorda che la funzione non dovrebbe essere usata negli ambienti di produzione a meno che tu non sappia esattamente cosa stai facendo.