Подтвердить что ты не робот

Нокаут .JS Наблюдаемые изменения массива на отдельные наблюдаемые элементы

У меня есть модель представления с observableArray (с именем "все" ) объектов. Одним из свойств этого объекта является имя observable. Я хочу, чтобы какой-то код выполнялся всякий раз, когда изменяется выбранное свойство дочернего объекта в массиве. Я попытался вручную подписаться на all через all.subscribe(), но этот код запускается только при добавлении или удалении элементов. Я обновил код, чтобы сделать это следующим образом:

all.subscribe(function () {
    ko.utils.arrayForEach(all(), function (item) {
        item.selected.subscribe(function () {
            //code to fire when selected changes
        });
    });
});

Правильно ли это делается или есть лучший способ?

4b9b3361

Ответ 1

Это близко к правилу. Подвижные подписки на массивы предназначены только для того, когда элементы добавляются или удаляются, а не изменяются. Поэтому, если вы хотите подписаться на какой-либо элемент, вам нужно подписаться на этот элемент:

Ключевой момент: отслеживаемый объект отслеживает объекты, находящиеся в массиве, а не состояние этих объектов

Простое помещение объекта в наблюдаемый массив не делает все свойства этих объектов видимыми. Конечно, вы можете сделать эти свойства наблюдаемыми, если хотите, но это независимый выбор. Наблюдаемый массив просто отслеживает, какие объекты он удерживает, и уведомляет слушателей о добавлении или удалении объектов.

(из документации нокаута)


Я говорю "близко к правильному", так как вы захотите удалить все старые подписки. В настоящее время, если наблюдаемый массив начинается с [a, b], вы подписываетесь на [a, b], но затем, если добавляется c, у вас есть две подписки для a и b плюс одна для c.