8

コードスニペットがあります:

var app = angular.module('Demo', []);

app.controller('DemoCtrl', function ($scope) {
  function notify(newValue, oldValue) {
    console.log('%s => %s', oldValue, newValue);
  }

  $scope.$watch('collection.length', notify);
  $scope.$watch('my', notify);

  $scope.collection = [];  
  $scope.my = 'hello';
});

$watch最初に発火します。このコード スニペットは次のように出力します。

0 => 0
hello => hello 

それは正しい行動ですか?もちろん、値が等しいかどうかを確認することはできますが、そのような動作の理由は何ですか?

PS このサンプルをオンラインで試すことができます: http://jsbin.com/otakaw/7/edit

4

1 に答える 1

8

ドキュメントによると:

リスナーは、現在の値 watchExpressionと前の呼び出しの値watchExpressionが等しくない場合にのみ呼び出されます (最初の run を除いて、以下を参照)。

ウォッチャーがスコープに登録された後、リスナー fn が( 経由で)非同期的に呼び出され$evalAsync、ウォッチャーが初期化されます。 まれに、の結果がwatchExpression変更されなかったときにリスナーが呼び出されるため、これは望ましくありません。リスナー内でこのシナリオを検出するにはfn、とを比較しnewValます oldVal。これら 2 つの値が同一 (===) の場合、リスナーは初期化のために呼び出されました。

于 2013-06-27T09:35:53.180 に答える