2013-04-08 10 views
31

Perché il trigger $watch si attiva direttamente dopo il caricamento della pagina e come posso impedirlo?

http://jsfiddle.net/dcSRu/2/

function MyCtrl($scope) { 
    // Init scope vars 
    $scope.data_copy = {}; 

    // If data_copy changes... 
    $scope.$watch("data_copy", function(newValue, oldValue) { 

     alert("$watch triggered!"); 

    }, true); 
} 
+0

Questo è anche il caso se si dispone di un controller o di una direttiva avviata qualche volta dopo il caricamento della pagina. – Andrew

risposta

49

Al primo avvio sia i valori (newValue e oldValue) sono uguali, quindi si può facilmente sfuggire che controllando per l'uguaglianza:

$scope.$watch("data_copy", function(newValue, oldValue) { 
    if(newValue === oldValue){ 
    return; 
    } 
    alert("$watch triggered!"); 
}); 

PLUNKER

+1

Ahh, grazie! Ma posso davvero confrontare i due oggetti con ===, non dovrei usare qualcosa come il carattere di sottolineatura _.isEqual (newValue, oldValue)? – tidelipop

+3

Does 'angular.equals' funziona per te. – Stewie

+0

Probabilmente, ma io uso già il trattino basso, quindi l'ho usato e ha funzionato benissimo. – tidelipop

1

Avvolgere la funzione di orologio $ in funzione angolare pronta.

angular.element(document).ready(function() 
{ 
    $scope.$watch("data_copy", function(newValue, oldValue) { 
    alert("$watch triggered!"); 
    }, true); 
}) 

Quando pagina carichi angolari. Cambia i valori e $ watch viene attivato.

Problemi correlati