$ver un objeto

Resuelto Vladimir Sidorenko asked hace 10 años • 8 respuestas

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?

Vladimir Sidorenko avatar Oct 19 '13 00:10 Vladimir Sidorenko
Aceptado

Llame $watchcon truecomo 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 la angular.equalsfunción. Para guardar el valor del objeto para una comparación posterior, angular.copyse utiliza la función. Por lo tanto, esto significa que observar objetos complejos tendrá implicaciones adversas para la memoria y el rendimiento.

rossipedia avatar Oct 18 '2013 17:10 rossipedia

El formobjeto no cambia, solo la namepropiedad 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++;
});
}
Jason avatar Oct 18 '2013 17:10 Jason