ko.mapping.fromJS
когда данный массив собирается превратить его в observableArray.
Итак, когда вы делаете group.Destinations(ko.mapping.fromJS(data))
, вы устанавливаете значение Destinations
observableArray равным observableArray. По сути, это просто означает, что он обернут дважды.
Вы могли бы сделать что-то вроде group.Destinations(ko.mapping.fromJS(data)())
jsFiddle не позволяет сохранять в данный момент, но вот ваш код упрощен для использования подключаемого модуля для обновления адресатов (setTimeouts для имитации AJAX):
<div id="pnlDestinations">
<ul data-bind="foreach: Groups">
<li>
<a href="#" data-bind="text: GroupName, click: $root.RetrieveDestinations"></a>
<ul data-bind="foreach: Destinations">
<li>
<a href="#" data-bind="text: DestinationName"></a>
</li>
</ul>
</li>
</ul>
</div>
ViewModel:
function ViewModel(groups) {
this.Groups = ko.mapping.fromJS(groups);
this.RetrieveDestinations = function (group) {
setTimeout(function() {
//fake data
var name = group.GroupName(),
data = [
{ DestinationName: name + "-1" },
{ DestinationName: name + "-2" },
{ DestinationName: name + "-3" }
];
ko.mapping.fromJS(data, {}, group.Destinations);
group.Destinations.push({ DestinationName: "new" });
}, 100);
};
}
$(function () {
setTimeout(function() {
var data = [
{ GroupName: "Group1", Destinations: [] },
{ GroupName: "Group2", Destinations: [] },
{ GroupName: "Group3", Destinations: [] }
];
ko.applyBindings(new ViewModel(data));
}, 100);
});