ko.mapping.fromJS
when given an array is going to turn it into an observableArray.
したがって、 group.Destinations(ko.mapping.fromJS(data))
を実行するときは、 Destinations
observableArrayの値をobservableArrayと同じに設定します。基本的には、これは2回ラップされたことを意味します。
You could do something like group.Destinations(ko.mapping.fromJS(data)())
jsFiddleは現在のところ保存を許可していませんが、ここでは、マッピングプラグインを使用して送り先を更新するためのコードを簡略化しています(AJAXをシミュレートするためのsetTimeouts)。
<div id="pnlDestinations">
</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);
});