Definir o objectEquality
parâmetro (terceiro parâmetro) da $watch
função é definitivamente a maneira correta de observar TODAS as propriedades da matriz.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran responde isso bem o suficiente e menciona $watchCollection
também.
Mais detalhes
O motivo pelo qual estou respondendo uma pergunta já respondida é porque quero ressaltar que a resposta do wizardwerdna não é boa e não deve ser usada.
O problema é que os resumos não acontecem imediatamente. Eles precisam esperar até que o bloco de código atual seja concluído antes de executar. Portanto, assistir o length
de uma matriz pode realmente perder algumas alterações importantes que $watchCollection
serão detectadas.
Suponha esta configuração:
$scope.testArray = [
{val:1},
{val:2}
];
$scope.$watch('testArray.length', function(newLength, oldLength) {
console.log('length changed: ', oldLength, ' -> ', newLength);
});
$scope.$watchCollection('testArray', function(newArray) {
console.log('testArray changed');
});
À primeira vista, pode parecer que estes disparariam ao mesmo tempo, como neste caso:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Isso funciona bem o suficiente, mas considere isso:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Observe que o comprimento resultante foi o mesmo, mesmo que a matriz tenha um novo elemento e tenha perdido um elemento, portanto, observe o que $watch
diz respeito, length
não mudou. $watchCollection
pegou nele, no entanto.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
O mesmo resultado acontece com um push e pop no mesmo bloco.
Conclusão
Para assistir a todas as propriedades da matriz, use $watch
a própria matriz com o terceiro parâmetro (objectEquality) incluído e definido como true. Sim, isso é caro, mas às vezes necessário.
Para observar quando o objeto entra / sai da matriz, use a $watchCollection
.
NÃO use a $watch
na length
propriedade da matriz. Quase não há uma boa razão para pensar nisso.
angular.equals
quando o terceiro argumento recebe um valor booleano ?