Как сделать нокаут наблюдаемых объектов внутри наблюдаемого массива

Я хочу реализовать наблюдаемый массив, и внутри этого массива должны быть наблюдаемые объекты (объект 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.