Quiero ver los cambios en un diccionario, pero por alguna razón no se llama a la devolución de llamada.
Aquí hay un controlador que uso:
function MyController($scope) {
$scope.form = {
name: 'my name',
surname: 'surname'
}
$scope.$watch('form', function(newVal, oldVal){
console.log('changed');
});
}
Aquí está el violín .
Espero que la devolución de llamada $ watch se active cada vez que se cambia el nombre o el apellido, pero no sucede.
¿Cuál es la forma correcta de hacerlo?
javascript
angularjs
angularjs-scope
Vladimir Sidorenko
fuente
fuente
Respuestas:
Llame
$watch
contrue
como tercer argumento:Por defecto, al comparar dos objetos complejos en JavaScript, se verificará la igualdad de "referencia", que pregunta si los dos objetos se refieren a la misma cosa, en lugar de la igualdad de "valor", que verifica si los valores de todas las propiedades de esos Los objetos son iguales.
Según la documentación angular , el tercer parámetro es para
objectEquality
:fuente
true
, verificará la igualdad de referencia si el valor observado es un objeto o una matriz. En ese caso, debe especificar explícitamente las propiedades, como$scope.$watch('form.name')
y$scope.$watch('form.surname')
El
form
objeto no cambia, solo laname
propiedad esviolín actualizado
fuente
Poco consejo de rendimiento si alguien tiene un tipo de servicio de almacén de datos con clave -> pares de valores:
Si tiene un servicio llamado dataStore , puede actualizar una marca de tiempo cada vez que cambie su objeto de big data. De esta manera, en lugar de observar todo el objeto en profundidad, solo está viendo una marca de tiempo para el cambio.
Y en una directiva solo estás viendo cómo cambia la marca de tiempo
fuente
newVal
,oldVal
en este ejemplo, los valores de la marca de tiempo no son los valores de los objetos observados. No invalida esta respuesta, solo creo que es un inconveniente que vale la pena mencionar.La razón por la cual su código no funciona es porque,
$watch
de manera predeterminada, hace una verificación de referencia. En pocas palabras, asegúrese de que el objeto que se le pasa es un objeto nuevo. Pero en su caso, solo está modificando alguna propiedad del objeto de formulario para no crear una nueva. Para que funcione, puede pasartrue
como tercer parámetro.Funcionará, pero puede usar $ watchCollection, que será más eficiente que $ watch porque
$watchCollection
buscará propiedades poco profundas en el objeto de formulario. P.ejfuente
Mientras busca cambios en los objetos de formulario, el mejor enfoque de observación es usar
$watchCollection
. Consulte la documentación oficial para conocer las diferentes características de rendimiento.fuente
Prueba esto:
fuente
Para cualquiera que quiera ver un cambio en un objeto dentro de una matriz de objetos, esto pareció funcionar para mí (ya que las otras soluciones en esta página no lo hicieron):
fuente
fuente