MVCプロジェクトでノックアウト(KO)を使用しています。サーバー上に(グリッド用の)MVCモデルを作成し、それをビューに渡します。ビューでは、シリアル化されてKOモデルに変換され(ko.mappingを使用)、バインドに使用されます。そのバインディングは、グリッド作成のためにHTMLで使用されます。
これは私のMVCグリッドモデルがどのように見えるかであり、ko.mappingによって対応するKOモデルに変換されます。
public class GridModel
{
/// <summary>
/// Grid body for the grid.
/// </summary>
public GridBodyModel GridBodyModel { get; set; }
/// <summary>
/// Grid context.
/// </summary>
public GridContext GridContext { get; set; }
/// <summary>
/// Grid header for the grid.
/// </summary>
public GridHeaderModel GridHeader { get; set; }
}
public class GridBodyModel
{
/// <summary>
/// List of grid body rows.
/// </summary>
public IList<GridRowModel> Rows { get; set; }
}
public class GridContext
{
/// <summary>
/// Total number of pages. Read-only.
/// </summary>
public int TotalPages{ get; set; }
}
public class GridHeaderModel
{
/// <summary>
/// List of grid header cells.
/// </summary>
public IList<GridHeaderCellModel> Cells { get; set; }
}
明らかなように、メインモデルクラスGridModelは、プロパティとして存在する次のクラスで構成されています。
GridBodyModel:グリッド本体にレンダリングされる行のリストがあります。
GridContext:プロパティとして総ページ数があります。他のプロパティもありますが、それはこの説明の範囲外です。
GridHeaderModel:グリッドのヘッダーに表示する必要のあるセルのリストがあります。
次に、新しいページの読み込み時に実行されるこのスクリプトがあります。
$(document).ready(function () {
// Apply Knockout view model bindings when document is in ready state.
ko.applyBindings(Global_GridKOModel, document.getElementById("gridMainContainer"));
});
// Serialize the server model object. It will be used to create observable model.
Global_GridKOModel = ko.mapping.fromJS (<%= DataFormatter.SerializeToJson(Model) %>);
Global_GridKOModelはグローバルJavaScript変数です。 モデルは、サーバーからのMVCグリッドモデルです。
ユーザーは、ページでさらに検索を再度実行できます。私はAjaxを介して新しい検索条件を投稿することでこれを処理します。この投稿では、新しいMVCモデルが作成され、Ajax応答として返送されます。次に、この新しいMVCモデルを使用して、ko.mappingを使用してGlobal_GridKOModelを更新します。これにより、新しいページの読み込み時に以前に構築されたグリッドが(新しいデータで)更新されます。これが私がやっている方法です。
$.ajax({
url: destUrl,
data: dataToSend
success: function (result) {
ko.mapping.fromJS(result, Global_GridKOModel);
},
error: function (request, textStatus, errorThrown) {
alert(request.statusText);
}
});
次のシナリオを除いて、すべてが正常に機能しています。
結果が返されないAjaxリクエストが作成されます。つまり、GridBodyModelとGridHeaderModelがモデルGridModelでnullになります。そのタイムグリッドは、レコードが見つからなかったことを正しく示しています。正解です。これは、次のHTMLバインディングによって発生します。
<!-- When no record is found. -->
<div data-bind="ifnot: GridContext.GridPager.TotalPages() > 0">
No record(s) were found.
</div>
<!-- This is actual grid table container. This is binded when records are found -->
<div data-bind="if: GridContext.TotalPages() > 0">
Grid construction happens here
</div>
この後、別のAjaxリクエストが行われたが、今回はレコードが返される場合(firebugで応答を確認し、レコードが実際に返されることを確認しました)。この時間グリッド構築は、さまざまな監視可能なアレイにアクセスする場合に発生します。たとえば、グリッドのページャーを作成するには、私が作成したHTMLバインディングを使用します。
<td data-bind="attr:{colspan: GridHeader.Cells().length }">
今回、KOはfirebugで見られる次のエラーをスローします。
バインディングを解析できません。メッセージ:TypeError:GridHeader.Cellsは関数ではありません。バインディング値:attr:{colspan:GridHeader.Cells()。length}
レコードが返される限りは正常に機能しますが、上記で説明したように、レコードが返されないと機能しなくなります。レコードが返されない場合、以前の応答ではGridHeaderがnullであったことに注意してください。ko.mappingで何か魚臭い匂いがします。監視可能な配列をマッピングする際に問題があると思います。
それで、私が正しくやっていないのは何ですか?誰かお願いします?
はっきりと述べていない場合は、遠慮なく説明を求めてください。
前もって感謝します。