Ver múltiples atributos de $scope

Resuelto Greg asked hace 12 años • 11 respuestas

¿Hay alguna manera de suscribirse a eventos en múltiples objetos usando$watch

P.ej

$scope.$watch('item1, item2', function () { });
Greg avatar Aug 14 '12 19:08 Greg
Aceptado

A partir de AngularJS 1.3 hay un nuevo método llamado $watchGrouppara 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 
});
Paolo Moretti avatar May 06 '2014 12:05 Paolo Moretti

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í

Răzvan Flavius Panda avatar Jun 20 '2013 22:06 Răzvan Flavius Panda

$watchEl 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
});
Andrew Joslin avatar Aug 14 '2012 13:08 Andrew Joslin

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.

Karen Zilles avatar Jan 19 '2013 01:01 Karen Zilles

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();
             }
         });
Yang Zhang avatar May 20 '2015 23:05 Yang Zhang