Как сделать нокаут наблюдаемых объектов внутри наблюдаемого массива
Я хочу реализовать наблюдаемый массив, и внутри этого массива должны быть наблюдаемые объекты (объект JS). И в представлении я повторяю этот массив и получаю объект и показываю свойства объекта. Скажем, есть такой объект, как следующий,
{"name":"john","age":21,"address":"No 25"}
Представьте, что наблюдаемый массив состоит из таких объектов, как указано выше.
Затем я хочу изменить одно свойство (например, имя) конкретного объекта и вам нужно увидеть изменение в представлении.
Как я могу сделать это с помощью нокаута?
Спасибо.
Ответы
Ответ 1
Если вы настроите своих пользователей в viewModel и нарисуете карту с сопоставлением нокаутов, вы получите желаемый результат. Что-то вроде:
myObservableArray.push(new UserViewModel( {"name":"john","age":21,"address":"No 25"} ));
var UserViewModel = function(data){
var self = this;
ko.mapping.fromJS(data, {}, self);
}
Таким образом, каждый из отображаемых свойств будет наблюдаемым, и когда они изменятся, это будет отражено в вашей разметке.
Ответ 2
Чтобы преобразовать модель в наблюдаемую модель представления, вы можете использовать ko.utils.arrayMap и ko.mapping.fromJS.
var source = [{"name":"john","age":21,"address":"No 25"}];
var vm = ko.utils.arrayMap(source, function (item) {
return ko.mapping.fromJS(item)
});
См. скрипку
Ответ 3
Просто определите новую модель для своих элементов данных и сделайте каждое свойство наблюдаемым, например:
var dataItemModel = function (name, age, address) {
this.name = ko.observable(name);
this.age = ko.observable(age);
this.address = ko.observable(address);
}
Когда вы получите свои данные, переверните их, создайте свой dataItemModel
(который имеет наблюдаемые свойства), а затем добавьте этот элемент в свой ObservableArray
.