回答:
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
});
$scope.$watchGroup(['mycustomctrl.foo', 'mycustomctrl.bar'],...
newValues
と、プロパティが個別に通常どおり動作するのを監視しながら、oldValues
as およびで1回だけ実行されることがわかりundefined
ます。
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
});
ここにプランカーの例
ドキュメントはこちら
$watchCollection
とは、オブジェクトを渡してオブジェクトのプロパティの変更を監視する$watchGroup
ことを目的としていますが、個々のプロパティの配列を渡して変更を監視することを目的としています。類似するが異なる問題に取り組むために少し異なります。ふew!
$watch
最初のパラメータは関数にすることもできます。
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
2つの組み合わせた値が単純な場合、最初のパラメーターは通常、単なる角度式です。たとえば、firstNameとlastName:
$scope.$watch('firstName + lastName', function() {
//stuff
});
fullName = firstName + " " + lastName
最初の引数として関数を渡す必要があります(のような単純な式ではなく'firstName, lastName'
)。Angularは非常に強力ですが、パフォーマンスや設計の原則を損なうことのない(思われる)方法で、非常に開発者が使いやすい領域がいくつかあります。
$scope.$watch('firstName + lastName', function() {...})
。また、2つの時計を実行することもできますfunction nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);
。答えに簡単なケースを追加しました。
これは、実際に機能する元の疑似コードと非常によく似た解決策です。
$scope.$watch('[item1, item2] | json', function () { });
編集:さて、私はこれがさらに良いと思います:
$scope.$watch('[item1, item2]', function () { }, true);
基本的にjsonのステップをスキップしていますが、そもそも最初は馬鹿げているように見えましたが、それなしでは機能しませんでした。それらのキーは、参照の等価ではなくオブジェクトの等価をオンにする、しばしば省略される3番目のパラメーターです。次に、作成した配列オブジェクト間の比較が実際に正しく機能します。
TypeError: Object #<Object> has no method '$watchCollection'
が発生しましたが、この解決策は問題の解決に役立ちます!
$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
$ watchGroupの関数を使用して、スコープ内のオブジェクトのフィールドを選択できます。
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
_this
?スコープは、明示的に定義せずに関数に引き継がれませんか?
単純にそれをラップしないのはなぜforEach
ですか?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
これは、実際に値の構成を気にする必要がない、結合された値の関数を提供するのとほぼ同じオーバーヘッドです。
changed()
いずれかのプロパティで何かが変更されるたびに呼び出されます。これは、結合された値の関数が提供された場合とまったく同じ動作です。
$ watchの最初のパラメーターは、角度式または関数です。$ scope。$ watchのドキュメントを参照してください。$ watchメソッドの動作に関する多くの有用な情報が含まれています。watchExpressionが呼び出されたとき、angularが結果を比較する方法などです。
どのように:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
true
toへの3番目のパラメーターがないと、毎回起動します。scope.$watch
listener()
return { a: functionA(), b: functionB(), ... }
。次に、返された新しい値と古い値のオブジェクトを相互にチェックします。
$scope.$watch('age + name', function () {
//called when name or age changed
});
ここでは、年齢と名前の値の両方が変更されたときに関数が呼び出されます。
$watchGroup
バージョン1.3で導入されたAngular を使用すると、複数の変数を監視できます。単一の$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]);
});