W mojej dyrektywie niestandardowej dodaję elementy do DOM na podstawie liczby obiektów w mojej tablicy źródeł danych. Muszę obejrzeć konkretną właściwość w każdym obiekcie. Kiedy dodaję te elementy do DOM, chcę ustawić $ watch na własności checked
każdego obiektu w tablicy toppings
, ale to nie działa i nie wiem dlaczego. Ustawiam breakpoint wewnątrz funkcji, która powinna zostać wywołana, gdy właściwość zmieni się z true na false lub false na true, ale ta funkcja nigdy nie zostanie wywołana. Czy ten powód jest oczywisty? Uczę się właśnie Angulara, więc mógłbym łatwo popełnić głupi błąd.AngularJS: obserwowanie konkretnej właściwości w tablicy obiektów w celu zmiany wartości właściwości
$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' }
]
Każdy obiekt w modelu otrzymuje nową właściwość checked
, która będzie miała wartość true lub false.
UWAGA: tablica obiektów będzie zawierać maksymalnie kilkanaście pozycji. Wydajność nie jest problemem.
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>
Podejście funkcyjne zadziałało. Dzięki! – Tim
Wadą tego podejścia jest to, że tworzysz jednego obserwatora na klucz na obiekcie. $ WatchCollection jest bardziej performatywny. –
@William Lepinski: Czy możesz wyjaśnić, dlaczego WatchCollection w tablicy, która musi oglądać każdą nieruchomość na każdym przedmiocie, będzie działał lepiej niż zegarek tylko na obiekcie, który muszę oglądać? Nie kłócę się, chciałbym tylko wiedzieć, jak to się robi. W jaki sposób realizowany jest głęboki zegarek? – Tim