を使用して複数のオブジェクトのイベントをサブスクライブする方法はありますか$watch
例えば
$scope.$watch('item1, item2', function () { });
を使用して複数のオブジェクトのイベントをサブスクライブする方法はありますか$watch
例えば
$scope.$watch('item1, item2', function () { });
AngularJS 1.3から$watchGroup
、一連の式を監視するために呼び出される新しいメソッドがあります。
$scope.foo = 'foo';
$scope.bar = 'bar';
$scope.$watchGroup(['foo', 'bar'], function(newValues, oldValues, scope) {
// newValues array contains the current values of the watch expressions
// with the indexes matching those of the watchExpression array
// i.e.
// newValues[0] -> $scope.foo
// and
// newValues[1] -> $scope.bar
});
AngularJS 1.1.4以降では、以下を使用できます$watchCollection
。
$scope.$watchCollection('[item1, item2]', function(newValues, oldValues){
// do stuff here
// newValues and oldValues contain the new and respectively old value
// of the observed collection array
});
プランカーの例はこちら
ここにドキュメント
$watch
最初のパラメーターは関数にすることもできます。
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
2つの組み合わせた値が単純な場合、最初のパラメーターは通常、角度式にすぎません。たとえば、firstNameとlastNameは次のとおりです。
$scope.$watch('firstName + lastName', function() {
//stuff
});
これは、実際に機能する元の擬似コードと非常によく似たソリューションです。
$scope.$watch('[item1, item2] | json', function () { });
編集:さて、私はこれがさらに良いと思います:
$scope.$watch('[item1, item2]', function () { }, true);
基本的に、最初は馬鹿げているように見えたjsonステップをスキップしていますが、それなしでは機能しませんでした。それらのキーは、参照の同等性ではなくオブジェクトの同等性をオンにする、しばしば省略される3番目のパラメーターです。次に、作成した配列オブジェクト間の比較が実際に正しく機能します。
$ watchGroupの関数を使用して、スコープ内のオブジェクトのフィールドを選択できます。
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
単純に包んでみませんforEach
か?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
これは、実際に値の構成を気にすることなく、結合された値の関数を提供するのとほぼ同じオーバーヘッドです。
値を組み合わせるためのもう少し安全な解決策は、$watch
関数として以下を使用することです。
function() { return angular.toJson([item1, item2]) }
また
$scope.$watch(
function() {
return angular.toJson([item1, item2]);
},
function() {
// Stuff to do after either value changes
});
$ watchの最初のパラメーターは、角度式または関数にすることができます。$scope。$watchのドキュメントを参照してください。$ watchメソッドがどのように機能するかについての多くの有用な情報が含まれています:watchExpressionが呼び出されたとき、angularが結果を比較する方法など。
どうですか:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
$scope.$watch('age + name', function () {
//called when name or age changed
});
ここでは、年齢と名前の両方の値が変更されたときに関数が呼び出されます。
バージョン1.3で導入されたAngular$watchGroup
を使用すると、複数の変数を監視できます。単一の$watchGroup
ブロック
$watchGroup
で配列を最初のパラメーターとして使用し、監視するすべての変数を含めることができます。
$scope.$watchGroup(['var1','var2'],function(newVals,oldVals){
console.log("new value of var1 = " newVals[0]);
console.log("new value of var2 = " newVals[1]);
console.log("old value of var1 = " oldVals[0]);
console.log("old value of var2 = " oldVals[1]);
});