階層ビューモデルを使用したノックアウトjsとマッピングプラグインに問題があります
私のビューモデルは次のように構成されています。
VM = {
members:[
{
name:"name 1",
volunteering:[{...},{...},{...}]
},
{
name:"name 1",
volunteering:[{...},{...},{...}]
}
]
}
各メンバーはタブ内にあり、各タブにはボランティア活動のグリッドがあります。グリッド内の項目をクリックすると、ボランティア活動を編集するためのダイアログボックスがポップアップ表示されます。この時点で、「編集のキャンセル」機能を容易にするためにオブジェクトのクローンを作成します
var Volunteer = {};
var koContext=ko.contextFor(this);
Volunteer = ko.mapping.toJS(koContext.$data); //plain js volunteer
Volunteer.index=koContext.$parent.EventVolunteers().indexOf(koContext.$data); //index of volunteer in member volunteer array
ko.applyBindings(ko.mapping.fromJS(Volunteer),$("#dialog-EditVolunteer")[0]); //bind new volunteer obj to dialog
この時点までは問題ないようですが、ダイアログで[保存]をクリックすると問題が発生します。
var volunteer = ko.mapping.toJS(ko.contextFor(this).$data);
ko.mapping.fromJS(volunteer,{},ko.contextFor(currentTab).$data.EventVolunteers()[volunteer.index]);
この時点で、プロパティはビューモデルで更新されますが、メイン画面のグリッドでは更新されません。
ko.mapping.fromJSがオブザーバブルを更新するのではなく置き換えているようです。