$ver un objeto
Quiero estar atento a 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');
});
}
aqui esta el violín .
Espero que se active la devolución de llamada de $watch cada vez que se cambia el nombre o el apellido, pero no sucede.
¿Cuál es la forma correcta de hacerlo?
Llame $watch
con true
como tercer argumento:
$scope.$watch('form', function(newVal, oldVal){
console.log('changed');
}, true);
De forma predeterminada, al comparar dos objetos complejos en JavaScript, se verificará la igualdad de "referencia", que pregunta si los dos objetos se refieren a lo mismo, 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 de Angular , el tercer parámetro es para objectEquality
:
Cuando
objectEquality == true
, la desigualdad de watchExpression se determina según laangular.equals
función. Para guardar el valor del objeto para una comparación posterior,angular.copy
se utiliza la función. Por lo tanto, esto significa que observar objetos complejos tendrá implicaciones adversas para la memoria y el rendimiento.
El form
objeto no cambia, solo la name
propiedad cambia.
violín actualizado
function MyController($scope) {
$scope.form = {
name: 'my name',
}
$scope.changeCount = 0;
$scope.$watch('form.name', function(newVal, oldVal){
console.log('changed');
$scope.changeCount++;
});
}