0

次のコードを検討してください。

function ListCtrl($scope){

  this.fetchResults = function(){};

  // so I can pass this as a reference & spyOn fetchResults
  function fetchResults = function(){return this.fetchResults()}.bind(this);

  $scope.page = 1;
  $scope.order = null;

  $scope.$watch('page',fetchResults);
  $scope.$watch('order',fetchResults);

  this.fetchResults();

}

このコードをこの方法で記述したいので、各時計が をトリガーするかどうかをテストできますfetchResults。しかし、このように、初期化すると、 3回ListCtrl呼び出しますfetchResults

  1. 明示的に呼び出された
  2. 為に$watch('page')
  3. 為に$watch('order')

ListCtrl初期化時に一度だけ呼び出しを行うにはどうすればよいfetchResultsですか?

4

2 に答える 2

4

$scope.$watch ドキュメントから:

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

したがって、次のようなことができます。

function watchFetchResults(newValue, oldValue) {
  if(newValue !== oldValue){
    fetchResults();
  }
}

$scope.$watch('page',watchFetchResults);
$scope.$watch('order',watchFetchResults);
于 2013-05-18T08:47:46.137 に答える
1

次のこともできます。

$scope.$watch('page + order', fetch);

これは、両方の式を一度に監視し、単純にそれらを角度のある式に連結します。

于 2013-05-18T09:47:04.883 に答える