次の設定(多かれ少なかれ)を持つアプリケーションがあります:
JS
var ObjectVM = function(data) {
var me = this;
me.name = ko.observable(data.name);
//Set other properties
...
me.isSelected(false);
};
var VM = function () {
var me = this;
me.Records = [];
me.Selected = ko.observable(undefined);
me.Select = function (rec) {
if (rec.hasChanges == undefined) {
//attach editable functionality
ko.editable(record);
}
rec.isSelected(true);
rec.beginEdit();
if (me.Selected() != undefined) {
if (me.Selected().hasChanges()) {
me.Selected().rollback();
}
me.Selected().isSelected(false);
me.Selected().commit();
}
me.Selected(rec);
//Do some hiding/showing of form...
};
me.Init = function(){
$.ajax({...,
success: function(data){
for(var i = 0;i< data.length;i++){
me.Records.push(new ObjectVM(data[i]));
}
}
};
};
HTML
<div>
RECORDS DISPLAY GRID (Pretend it's a table with 5 columns and 10 rows)
</div>
<div data-bind="with: Selected">
<form id="editRec">
<label>Name</label>
<input data-bind="value: name" />
</form>
</div>
VMSelect関数を呼び出すテーブル行にクリックバインディング設定があります。「with」バインディングを使用すると、Selected()が未定義の場合はフォームが削除され、Selected()にレコードがある場合は追加されます。これが発生するたびに、フォームに添付されていた検証、タブ、およびイベントバインディング(非KOバインディング)が失われるという問題。アプリケーションは完全に機能しますが、フォーム、セットアップ検証、UI構成、およびバインディングを再追加する必要があるため、レコード間で変更するとパフォーマンスが低下します。
フォームをページに残し、バインディングと設定を維持する方法はありますか、それとも、Selected値が変更されるたびにヒットを処理するように強制されますか?