2012-04-16 1 views
6

Кажется, что нокаут не правильно отображает свойства объектов в массиве.Нокаут не отображает свойства объекта в массиве

Смотрите этот пример из хромированной консоли:

> var viewmodel = ko.mapping.fromJS({list:[]}); 
undefined 

> viewmodel.list().unshift({ name : ko.observable("Foo") }); 
1 

> viewmodel.list()[0].name(); 
"Foo" 

> var js = ko.mapping.toJS(viewmodel); 
undefined 

> js.list[0].name; 
undefined 

Так Javascript объект создается, но свойство «имя» не получает карту.

Любые идеи приветствуются!

ответ

11

С http://knockoutjs.com/documentation/plugins-mapping.html, о функции toJS():

Это создаст неотображённый объект, содержащий только свойство преобразованного объекта, которые были частью исходного объекта JS.

Поскольку «имя» не было частью исходного объекта, который вы отображали, он не получает неотображаемый. Вы должны сказать отображение плагину, чтобы включить это специфическое свойство:

var js = ko.mapping.toJS(viewmodel, { include: ['name'] }); 
+0

Спасибо за быстрый ответ. Есть ли способ изменить поведение для сопоставления каждого свойства? Документация, похоже, не упоминает об этом. –

+0

@RichardAstbury Я так не думаю. Вам нужно будет жестко закодировать это в настраиваемую версию плагина сопоставления. – Niko

+2

С тех пор я нашел ko.toJSON (viewModel), который, похоже, выполняет эту работу. –

3

Хотя ответ Нико правильно - есть способ преодолеть эту проблему ..

Я должен сказать, что это немного уродливому взломать, но это делает работу, и это довольно легко понять:

ko.mapping.toJS(ko.mapping.fromJSON(ko.toJSON(viewmodel))) 

I карта модели представления от наблюдаемого в JSon к наблюдаемому (со всеми свойствами, отображенных) объект.