Knockout で使用するために、.Net オブジェクトを JavaScript オブジェクトにシリアル化しています。ノックアウト ビュー モデルの observable および observableArray プロパティをすべて指定することなく、Knockout のマッピング プラグインを使用してビュー モデルを構築しようとしています。このページは、ビュー モデルを構築し、データを読み込み、基本的なテーブルを構築します。
これはうまく機能しています。クリック イベントを列の 1 つにバインドしました。クリックすると、選択したクライアントと共にビュー モデル全体がコントローラーに送信されます。コードの結果、ProbationOfficeWideQueueItems コレクションから 1 つのレコードが削除されます。これは、ajax 呼び出しで返される値を確認することで確認できました。
私が抱えている問題は、ビュー モデルが ko.mapping.fromJS 呼び出しで更新されないように見えることです。ドキュメントと他の複数のスタック オーバーフローの投稿を確認しましたが、問題は見つかりませんでした。
- MVC 4(Razor) KnockoutJS & DataTable
- Knockout.js ko.mapping.toJS がビューのデータを更新しない
- Knockout.js - ko.mapping.fromJS - Visible Binding が更新されない
- 1 つの ko.mapping.fromJS が機能し、他の 1 つが機能しないのはなぜですか?
- http://knockoutjs.com/documentation/plugins-mapping.html
HTML と Javascript の両方のページ全体を次に示します。
<div id="probationOfficeWideQueue-@ViewData("UniqueID")">
<table id="data-grid-@ViewData("UniqueID")" class="data-grid-@ViewData("UniqueID")">
<thead>
<tr>
<th>Client Number</th>
<th>Client Name</th>
<th>Officer</th>
<th>Check In</th>
<th>Send To</th>
</tr>
</thead>
<tbody data-bind="foreach: ProbationOfficeWideQueueItems">
<tr>
<td data-bind="text: ClientNumber"></td>
<td data-bind="text: ClientName"></td>
<td data-bind="text: Officer"></td>
<td data-bind="click: $root.checkInClient"></td>
<td><input data-bind="value: SendToOfficer, text: Officer" /></td>
</tr>
</tbody>
</table>
<script type="text/javascript">
var viewModel = @Html.Raw(New JavaScriptSerializer().Serialize(Model));
function ProbationOfficeWideQueueViewModel(data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
self.checkInClient = function(row) {
openLoadScreen();
self.SelectedClientPIN = row.ClientPIN;
$.ajax({
type: "POST",
url: getRoot() + "Probation/ProbationOfficeWideQueue/CheckInClient",
data: ko.toJSON(self),
contentType: "application/json",
success: function(results){
ko.mapping.fromJS(results, self)
closeLoadScreen();
},
error: function(error){
closeLoadScreen();
}
});
}
};
function EnhanceDataTable() {
$('.data-grid-@ViewData("UniqueID")').dataTable({
"bPaginate": false,
"bLengthChange": false,
"aaSorting": [[1, 'asc'], [2, 'asc']],
"oLanguage": {
"sSearch": "Filter: "
},
"fnDrawCallback": function(){
$('table.data-grid td').bind('mouseenter', function () { $(this).parent().children().each(function(){$(this).addClass('dataTableRowHighlight');}); });
$('table.data-grid td').bind('mouseleave', function () { $(this).parent().children().each(function(){$(this).removeClass('dataTableRowHighlight');}); });
}
});
};
ko.applyBindings(new ProbationOfficeWideQueueViewModel(viewModel), $("#probationOfficeWideQueue-@ViewData("UniqueID")")[0]);
EnhanceDataTable();
マッパープラグインなしでノックアウトを使用し、監視可能なプロパティと配列を定義して入力すると、テーブルの行が適切に更新されます。これが私のフォールバック計画です。どこが間違っているのか教えてください。
編集: 最初のフィードバックの後、ajax 呼び出しの成功関数の ko.mapping.fromJS(results, self) 行でセミコロンを試したことを伝えたいと思います。また、成功方法の行に次の変更を加えました。
- self = ko.mapping.fromJS(結果);
- self = ko.mapping.fromJS(results, {}, self);
- ko.mapping.fromJS(結果、{}、自己);
- ko.mapping.fromJSON(結果、{}、自己);
また、例の 1 つのようにモデル プロパティに割り当てようとしました。
- self.Model = ko.mapping.fromJS(results, {}, self);
テーブルの DataTables.net プラグインを無効にした後、これも試しました。