2013-04-08 4 views
31

ページロード直後に$watchがトリガーするのはなぜですか?これを防止するにはどうすればよいですか?

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

これは、ページロード後しばらくして開始されたコントローラまたはディレクティブを持っていた場合にも当てはまります。 – Andrew

答えて

49

最初の実行では、両方の値(newValueoldValue)は同じであるので、あなたは簡単に平等をチェックして、それを逃れることがあります。

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

PLUNKER

+1

ああ、ありがとう!しかし、私は本当に二つのオブジェクトを===と比較できますか?アンダースコアの_.isEqual(newValue、oldValue)のようなものを使うべきではありませんか? – tidelipop

+3

'angular.equals'はあなたのために働きますか? – Stewie

+0

おそらく、私はすでにアンダースコアを使用していますので、代わりにそれを使用していました。 – tidelipop

1

ラップ$ウォッチ機能を角度準備完了機能に組み込みます。

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

角度ロードのページ。それは値を変更し、$ watchがトリガされます。

関連する問題