Обновления модели вложенного представления Knockoutjs

Я пытаюсь понять, как я могу иметь вложенные модели представления knockoutjs с небольшой скрипкой, в которой перечислены некоторые элементы, и при нажатии кнопки отображается подробная информация об этом элементе. Затем у меня есть кнопка, которая обновляет свойство Id каждого элемента, добавляя 15 к каждому элементу, но по какой-то причине в конце они имеют одинаковое значение. Может ли кто-нибудь просветить меня?

Спасибо!

Рассматриваемая скрипка

2 ответа

Решение

Это ваш .Name компьютерная собственность. Изменение идентификатора работает правильно.

http://fiddle.jshell.net/Y3JXD/1/

item в закрытии всегда был последним item в списке после первого исполнения. Помните, что вычисленное обновляется каждый раз, когда наблюдаемые изменения. Итак, в первый раз во время установки, он работал нормально, как item был item из цикла. Но то, что было захвачено в закрытии, было просто item (15-й пункт), а не тот, который был для этого конкретного экземпляра цикла.

Обновление: забыл о втором параметре для вычисления, как предложено в комментарии.

http://fiddle.jshell.net/Y3JXD/1/

item.Name = ko.computed(function () { return 'Item_' + item.Id(); }, item);            

Вот еще один метод, чтобы обернуть ссылку в замыкание, и захватить право item экземпляр (просто как демонстрация того, что должно произойти, чтобы захватить надлежащий объем).

self.loadItems = function () {
    for (var i = 0; i < 15; i++) {
        var item = ko.mapping.fromJS({
            Id: i
        });
        self.items.push(item);
        (function (item) {
            item.Name = ko.computed(function () {
                return 'Item_' + item.Id();
            });
        })(item);
    }
};

Не могли бы вы переместить Name собственность на itemModel?

self.Name = ko.computed(function() { 
    return 'Item_' + self.Id();
});

Кажется странным устанавливать его при создании объекта, а не при его использовании.

Другие вопросы по тегам