Обновления модели вложенного представления 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();
});
Кажется странным устанавливать его при создании объекта, а не при его использовании.