2013-02-19 19 views
259

Ho una funzione di controllo nella mia applicazione AngularJS.

$scope.$watch('quartzCrystal', function() { 
    ... 
} 

Tuttavia, dopo qualche condizione (nel mio esempio, cambiare la pagina al mio single-page application) Voglio smettere di quell'orologio (come come compensazione timeout).

Come posso farlo?

risposta

482

$watch restituisce una funzione di cancellazione. Chiamarlo cancellerebbe il $watcher.

var listener = $scope.$watch("quartz", function() {}); 
// ... 
listener(); // Would clear the watch 
+20

Sai se è una buona pratica annullare la registrazione di tutti i tuoi ascoltatori alla fine del ciclo di vita di un controller (come su '$ on ('$ destroy')') o AngularJS si prenderà cura di loro? Grazie! – yorch

+72

Tutti gli osservatori verranno rimossi quando l'oscilloscopio viene distrutto, non è necessario gestirli –

+0

@ UmurKontacı - hai una fonte per il tuo reclamo che quando un cannocchiale viene distrutto gli osservatori vengono rimossi? Non sembra essere parte della funzione ['$ destroy'] (https://github.com/angular/angular.js/blob/cceb455fb167571e26341ded6b595dafd4d92bc6/src/ng/rootScope.js#L693) – jelinson

45

scope. $ Watch restituisce una funzione che è possibile chiamare e che annullerà la registrazione dell'orologio.

Qualcosa di simile:

var unbindWatch = $scope.$watch("myvariable", function() { 
    //... 
}); 

setTimeout(function() { 
    unbindWatch(); 
}, 1000); 
+4

mi chiedo se si può chiamare nel campo di applicazione del watchFn –

+14

Sì, siete in grado di separare all'interno del watchFn! Caso d'uso semplice: vuoi guardare ed eseguire l'orologio solo una volta, quindi smettere di guardare. –

+3

Sono in grado di ricollegare l'orologio dopo aver chiamato la funzione unbind, come richiamarla di nuovo? –

3

Qualche tempo il vostro $ orologio sta chiamando dynamically e creerà le sue istanze quindi bisogna chiamare la funzione cancellazione prima della funzione $watch

if(myWatchFun) 
    myWatchFun(); // it will destroy your previous $watch if any exist 
myWatchFun = $scope.$watch("abc", function() {}); 
18

È possibile anche cancellare l'orologio all'interno della richiamata se si voglio chiarirlo subito dopo che qualcosa accade. In questo modo il tuo orologio $ rimarrà attivo fino al momento dell'utilizzo.

Come così ...

var clearWatch = $scope.$watch('quartzCrystal', function(crystal){ 
    if(isQuartz(crystal)){ 
    // do something special and then stop watching! 
    clearWatch(); 
    }else{ 
    // maybe do something special but keep watching! 
    } 
} 
-10

Per scartando la copia di osservatori, è possibile utilizzare questo:

watchers = void 0; 
2

Se avete troppo osservatori ed è necessario cancellare tutti loro, puoi spingerli in un array e distruggere ogni $watch in un ciclo.

var watchers = []; 
watchers.push($scope.$watch('watch-xxx', function(newVal){ 
    //do something 
}));  

for(var i = 0; i < watchers.length; ++i){ 
    if(typeof watchers[i] === 'function'){ 
     watchers[i](); 
    } 
} 

watchers = []; 
0

Idealmente, ogni orologio personalizzato deve essere rimosso quando si lascia l'ambito.

Aiuta a migliorare la gestione della memoria e le prestazioni delle app migliori.

// call to $watch will return a de-register function 
var listener = $scope.$watch(someVariableToWatch, function(....)); 

$scope.$on('$destroy', function() { 
    listener(); // call the de-register function on scope destroy 
});