あなたの問題の解決策は、ビューモデルを間違った方法で考えることにあると思います。ビュー モデルは、データをビューに配信するだけでなく、データを送信するためのプレース ホルダーでもあります。
私が通常ノックアウトで作業する方法では、空のビューモデルをビューに送信することはありません。ビューモデルには通常、私がバインドしているすべてのフィールドがあります。それらは空の文字列、または表示値のない初期化されたオブジェクトである可能性がありますが、実際のオブジェクトはまだ存在し、バインドしているフィールドへの各オブジェクトの適切な表現があります。
ビューに何も送信するのではなく、単に空のオブジェクトを送信することを検討することをお勧めします。
編集: 例は un ASP.NET MVC です
基本的に、サーバー側で、表示する必要があるすべてのデータと収集する必要があるすべてのデータを含むビュー モデル オブジェクトを作成します。検証コードを簡単にするために、通常、収集するデータを独自のサブクラスに入れますが、それはすべてコードのニーズの問題です。
いずれにせよ、ビューに送られるすべてのオブジェクトは、オブジェクトの JSON シリアル化を生成する toJSON() メソッドを基本的に提供する vmBase クラスから継承されます。これは、ビュー エンジンによって私のビューで呼び出されます。以下のコードに示すように。
<script type='text/javascript'>
var viewModel = ko.mapping.fromJS(<%= Model.ToJson() %>);
$(document).ready( function () {
ko.applyBindings(viewModel);
});
</script>
コードを元に戻す準備ができたら、ビュー モデルの JS バージョンのプルを削除するだけです。
<script type='text/javascript'>
var dataToSendToServer = ko.toJS(viewModel);
</script>
ビューモデルの一部のみが変更されている一部のサナリオ (これは AJAX 更新を行っている場合) では、テンプレートを切り替えて別のバインディングを適用できるようにするなどのクールなことを行うことができます。この場合、元のデータ/テンプレートのコンテナーとして#ID_of_Containerを使用し、テンプレート (data-bind="" 要素を含むことができる) を新しいテンプレートID_of_Templateに置き換えます。
<script type='text/javascript'>
ko.cleanNode($("#ID_of_Container"));
delete (viewModel.Some_Element_To_Be_Updated);
viewModel = ko.mapping.updateFromJS(viewModel, New_Data_For_That_Element);
// Use ko.toJS(viewModel) because standard template plugin doesn't understand
// knockout observables
$("#ID_of_Container").html($("#ID_of_Template").tmpl(ko.toJS(viewModel)))
ko.applyBindings(viewModel, $("#ID_of_Container")[0]);
</script>