Yanıtlar:
AngularJS 1.3'ten başlayarak, $watchGroup
bir dizi ifadeyi gözlemlemek için çağrılan yeni bir yöntem var .
$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
ve oldValues
sıra undefined
bireysel özellikleri her zamanki gibi çalışmaya izlerken.
AngularJS 1.1.4 ile başlayarak şunları kullanabilirsiniz $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
});
Burada Plunker örneği
Buradaki belgeler
$watchCollection
bir nesneye teslim edilmeli ve nesnenin özelliklerinde herhangi bir değişiklik için bir saat sunarken, değişiklikleri izlemek için $watchGroup
bir dizi bireysel özellik verilmelidir. Benzer ama farklı sorunları çözmek için biraz farklı. Uf!
$watch
ilk parametre de bir işlev olabilir.
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
Birleştirilmiş iki değeriniz basitse, ilk parametre normalde yalnızca açısal bir ifadedir. Örneğin, firstName ve lastName:
$scope.$watch('firstName + lastName', function() {
//stuff
});
fullName = firstName + " " + lastName
bir işlevin ilk argüman olarak geçirilmesini gerektirir (örneğin, basit bir ifade yerine 'firstName, lastName'
). Açısal ÇOK güçlüdür, ancak performans veya tasarım ilkelerinden ödün vermeyen (görünüşte) şekilde çok daha geliştirici dostu olabileceği bazı alanlar vardır.
$scope.$watch('firstName + lastName', function() {...})
. Ayrıca, sadece iki saatler yapabilirdi: function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);
. Cevaba basit davayı ekledim.
İşte orijinal sahte kodunuza çok benzer bir çözüm, gerçekten işe yarıyor:
$scope.$watch('[item1, item2] | json', function () { });
EDIT: Tamam, bence bu daha da iyi:
$scope.$watch('[item1, item2]', function () { }, true);
Temel olarak, başlamak için aptal gibi görünen json adımını atlıyoruz, ancak onsuz çalışmadı. Anahtar, referans eşitliğine kıyasla nesne eşitliğini açan, genellikle atlanan 3. parametredir. Sonra oluşturulan dizi nesneleri arasındaki karşılaştırmalar gerçekten doğru çalışır.
TypeError: Object #<Object> has no method '$watchCollection'
ama bu çözüm benim sorunumu çözmek için bana yardımcı olur!
$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
Kapsam içindeki bir nesnenin alanlarını seçmek için $ watchGroup içindeki işlevleri kullanabilirsiniz.
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
_this
? Kapsam açıkça tanımlanmadan işlevlere aktarılmaz mı?
Neden sadece a forEach
?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
Değer bileşimi hakkında endişelenmenize gerek kalmadan , birleşik değer için bir işlev sağlamakla aynı yüke sahiptir .
changed()
özelliklerinden herhangi birinde bir değişiklik olduğunda çağrılır. Bu, birleştirilmiş değer için bir işlev sağlanmış gibi davranır.
Değerleri birleştirmek için biraz daha güvenli bir çözüm aşağıdakileri $watch
işleviniz olarak kullanmak olabilir :
function() { return angular.toJson([item1, item2]) }
veya
$scope.$watch(
function() {
return angular.toJson([item1, item2]);
},
function() {
// Stuff to do after either value changes
});
$ watch first parametresi açısal ifade veya işlev olabilir. $ Scope. $ Watch hakkındaki belgelere bakın . $ Watch yönteminin nasıl çalıştığı hakkında birçok yararlı bilgi içerir: watchExpression çağrıldığında, açısal sonuçları nasıl karşılaştırır vb.
nasıl:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
true
parametre olmadan scope.$watch
(örneğinizde olduğu gibi), listener()
her seferinde tetiklenir, çünkü anonim karma her seferinde farklı bir referansa sahiptir.
return { a: functionA(), b: functionB(), ... }
. Daha sonra yeni ve eski değerlerin döndürülen nesnelerini birbirlerine karşı kontrol ederim.
$scope.$watch('age + name', function () {
//called when name or age changed
});
Burada hem yaş hem de ad değeri değiştiğinde işlev çağrılır.
$watchGroup
Versiyon 1.3'te tanıtılan çoklu değişkenleri izleyebileceğimiz tek bir $watchGroup
blok ile
$watchGroup
diziyi izlemek için tüm değişkenlerimizi dahil edebileceğimiz ilk parametre olarak alıyor.
$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]);
});