У меня проблемы с пониманием того, как работают ko.mapping.fromJS и ko.mapping.toJS.Здесь объяснение моей проблемы упрощено: у меня есть объект Risk Array, поступающий с сервера, этот массив Risk имеет массив Places.
По какой-то странной причине после вызова ko.mapping.FromJS моего дочернего массива Placesочищается или скрывается, поэтому мой шаблон не может получить доступ к его содержимому ... Я обнаружил, что с помощью ko.mapping.ToJS я могу получить доступ к содержимому Places, но при этом он не обновляет мой шаблон после добавленияItem!
Я пытаюсь построить очень простую сетку, где я могу добавить места для первого риска в массиве для упрощения:
var FromServer = {"Risk":[{"SourceKey":0,"Places":{"Place":[{"SourceKey":1}]}}]}
var viewModel =
{
places : ko.mapping.fromJS(FromServer.Risk[0].Places.Place),
addPlace : function()
{
alert('Entering add place, places count:' + this.places.length);
this.places.push({SourceKey:"New SK"});
}
}
//If I leave this line it will update list but not refresh template
//If I comment it out it will show my Places array as empty!!!
viewModel = ko.mapping.toJS(viewModel)
ko.applyBindings(viewModel);
Вот мой пример HTML-кода для моегоgrid:
<p>You have asked for <span data-bind="text: places.length"> </span> place(s)</p>
<table data-bind="visible: places.length > 0">
<thead>
<tr>
<th>SourceKey</th>
</tr>
</thead>
<tbody data-bind='template: { name: "placeRowTemplate", foreach: places}'></tbody>
</table>
<button data-bind="click: addPlace">Add Place</button>
<script type="text/html" id="placeRowTemplate">
<tr>
<td><input class="required" data-bind="value: $data.SourceKey, uniqueName: true"/></td>
</tr>
</script>
Вот мой jsFiddle: Образец jsFiddle
Мой вопрос: почему я должен развернуть мою viewModel с помощью ko.mapping.ToJS, чтобы яможно манипулировать моим дочерним массивом? и как мне обновить мой шаблон в этом сценарии?
Пожалуйста, помогите!