14

以下に示すように、Angular の $watch 関数を使用すると、指定した属性が変更されたときにイベントを発生させることができます。スコープで変更が発生したときにイベントをリッスンする同様の方法はありますか?

// works
$scope.$watch("someval", function() { }, true);
$scope.$watch(function(scope){ return scope.someval; }, function() { }, true);

// doesn't work
$scope.$watch("this", function() { }, true);
$scope.$watch(function(scope){ return scope; }, function() { }, true);
4

4 に答える 4

24

$scope(@ValentynShybanovの推測を使用することを除いて)の変更を監視することはできないと思います。最も近い方法は、ダイジェスト呼び出しを監視することです。

$scope.$watch(function() { 
    console.log("digest called"); 
});

上記の関数は、スコープのプロパティに変更がない場合でも$digest、スコープでaが呼び出されるたびに呼び出されます。

于 2013-01-27T22:03:28.723 に答える
3

私は自分でこの問題に遭遇し、@ ValentynShybanovのコメントに似たもので解決しましたが、まったく同じではありませんでした。私のソリューションでは、コメントで述べたように、すべてのプロパティにプレフィックスを付ける必要はありません

動作中のplunkrを見る

var entireScope = {};
  for ( var i in $scope ){
    if ( i[0] !== '$' && i !== 'this' && i !== 'constructor'){
      console.log(i);
      entireScope[i] = $scope[i];
    }
  }

  $scope.entireScope = entireScope;

  $scope.$watch('entireScope', function( newValue, oldValue ){
   $log.info('entireScope has changed',newValue, oldValue);
  }, true);

ご覧のとおり、ソリューションはまったく同じですが、実際には、既存の構造を置き換えるのではなく、スコープに別のプロパティを追加します。この新しいプロパティはスコープ全体を表し (名前の由来)、それを見ることができます。

私が書いたループは一般的すぎるかもしれませんが、カスタマイズされた初期化に置き換えることができます。例えば:

$scope.entireScope = { 'someVal' : $scope.someVal }

このソリューションはニーズに応え、コードをリファクタリングする必要がなくなります。

于 2014-09-27T21:08:34.850 に答える