Ver múltiples atributos de $scope
¿Hay alguna manera de suscribirse a eventos en múltiples objetos usando$watch
P.ej
$scope.$watch('item1, item2', function () { });
A partir de AngularJS 1.3 hay un nuevo método llamado $watchGroup
para observar un conjunto de expresiones.
$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
});
A partir de AngularJS 1.1.4 puedes usar $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
});
Ejemplo de Plunker aquí
Documentación aquí
$watch
El primer parámetro también puede ser una función.
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
Si sus dos valores combinados son simples, el primer parámetro normalmente es solo una expresión angular. Por ejemplo, nombre y apellido:
$scope.$watch('firstName + lastName', function() {
//stuff
});
Aquí hay una solución muy similar a su pseudocódigo original que realmente funciona:
$scope.$watch('[item1, item2] | json', function () { });
EDITAR: Bien, creo que esto es aún mejor:
$scope.$watch('[item1, item2]', function () { }, true);
Básicamente, nos saltamos el paso json, que al principio parecía tonto, pero no funcionaba sin él. La clave es el tercer parámetro, a menudo omitido, que activa la igualdad de objetos en lugar de la igualdad de referencia. Entonces las comparaciones entre nuestros objetos de matriz creados realmente funcionan bien.
Puede utilizar funciones en $watchGroup para seleccionar campos de un objeto dentro del alcance.
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});