2013-11-28 1 views
1

Скажем, у меня есть эти данные:Использование Нокаут отображение плагина на объектах с детьми

var data = { 
    name: 'Graham', 
    children: [ 
     { id : 1, name : 'Lisa' } 
    ] 
} 

Теперь я отобразить его, добавить некоторые свойства и сопоставить его обратно:

var mappedData = ko.mapping.fromJS(data); 
mappedData.age = 44; 
mappedData.children[0].age = 12; 
var unmappedData = ko.mapping.toJS(mappedData); 

В корне unmappedData объекта, возраста нет, но в дочернем объекте это так. Это связано с тем, что плагин сопоставления отслеживает исходные свойства, но только для корневого объекта.

Есть ли способ, помимо использования пользовательского сопоставления «создать» для каждой дочерней коллекции от корня, чтобы включить отслеживание для дочерних объектов коллекции?

+0

Итак, вы хотите, чтобы на 'unmappedData.children [0] .age' не было 12? Или вы хотите, чтобы 'unmappedData.age' был равен 44? – nemesv

+0

В объекте unmappedData я хочу, чтобы возраст не отображался. И для корневого объекта, и для детей. – RolandG

+1

Тогда, вероятно, ваш единственный жизнеспособный вариант - использовать пользовательское сопоставление 'create' для каждой дочерней коллекции ... но вы можете сгенерировать конфигурацию отображения с помощью метода' ko.mapping.visitModel': http://jsfiddle.net/2AR75/ – nemesv

ответ

2

Возможно, ваш единственный жизнеспособный вариант должен использовать пользовательскую функцию create для каждой коллекции детской ...

Но вам не нужно вручную создать отображение можно генерировать с помощью метода ko.mapping.visitModel, что-то например:

var mapping = {}; 
ko.mapping.visitModel(data, function(item, parent) { 
    if (ko.mapping.getType(item) === "array") 
    { 
     mapping[parent] = { 
      create: function(op) { return ko.mapping.fromJS(op.data); } 
     } 
    } 
}); 
var mappedData = ko.mapping.fromJS(data, mapping); 

Демо-версия JSFiddle.