Nella mia direttiva personalizzata, sto aggiungendo elementi al DOM in base al numero di oggetti nella mia matrice di datasource. Devo guardare una proprietà specifica in ogni oggetto. Mentre aggiungo questi elementi al DOM, voglio impostare un $ watch sulla proprietà checked
di ciascun oggetto nell'array toppings
, ma non funziona, e non so perché. Ho impostato un breakpoint all'interno della funzione che deve essere invocato quando la proprietà passa da true a false o false a true, ma quella funzione non viene mai richiamata. La ragione è ovvia? Sto solo imparando Angular, quindi potrei facilmente fare un errore stupido.AngularJS: guardare una particolare proprietà in una matrice di oggetti per le modifiche nel valore della proprietà
$scope.bits = 66; (i.e. onions and olives)
$scope.toppings = [
{ topping: 1, bits: 2, name: 'onions' },
{ topping: 2, bits: 4, name: 'mushrooms' },
{ topping: 3, bits: 8, name: 'peppers' },
{ topping: 4, bits: 16, name: 'anchovies' },
{ topping: 5, bits: 32, name: 'artichokes' },
{ topping: 6, bits: 64, name: 'olives' },
{ topping: 7, bits: 128, name: 'sausage' },
{ topping: 8, bits: 256, name: 'pepperoni' }
]
Ogni oggetto nel modello ottiene un nuovo checked
proprietà che sarà vero o falso.
NOTA: l'array di oggetti contiene al massimo una dozzina di elementi. Le prestazioni non sono una preoccupazione.
link: function link(scope, iElement, iAttrs, controller, transcludeFn) {
<snip>
// At this point scope.model refers to $scope.toppings. Confirmed.
angular.forEach(scope.model, function (value, key) {
// bitwise: set checked to true|false based on scope.bits and topping.bits
scope.model[key].checked = ((value.bits & scope.bits) > 0);
scope.$watch(scope.model[key].checked, function() {
var totlBits = 0;
for (var i = 0; i < scope.model.length; i++) {
if (scope.model[i].checked) totlBits += scope.model[i].bits;
}
scope.bits = totlBits;
});
});
<snip>
L'approccio della funzione ha funzionato. Grazie! – Tim
Lo svantaggio di questo approccio è che si sta creando un osservatore per chiave sull'oggetto. $ WatchCollection è più performante. –
@William Lepinski: Puoi spiegare perché una watchCollection sull'array, che deve guardare ogni proprietà su ogni oggetto, si comporta meglio di un orologio solo sulla proprietà che ho bisogno di vedere? Non sono in disaccordo, vorrei solo sapere come si fa. Come viene implementata una vigilanza approfondita? – Tim