JavaScriptのグリッドの行の値をどのように変更して、グリッドと基になるデータソースで「ダーティ」としてマークされるのかを疑問に思っています。
例えば連絡先/顧客のリストがあります。 FirstName/LastName/IsPrimaryContactという3つのフィールドがあります。プライマリ連絡先は1つしか存在できないため、レコードでプライマリ連絡先をtrueに設定すると、データソースをループし、プライマリとして設定された他の連絡先をfalseに設定するJavaScriptコードがあります。
JavaScriptはすべて正常に起動し、データフィールドは正しく設定されますが、次の2つの問題があります。 Datasource.sync()を呼び出すときに同期されません
レコードのダーティフィールドを手動で設定することで2番目の問題を修正できますが、これは正しくないようです。グリッドレベルでフィールドを更新し、UIとデータソースの両方でフィールドを更新する必要があるように感じます。
これについてのアイデアはありますか?
ありがとう
基本的に、レコードを更新する場合は、モデルのsetメソッドを使用する必要があります。たとえば、dataSourceの最初のレコードを更新するには、次のように更新する必要があります。
var firstItem = $('#GridName').data().kendoGrid.dataSource.data()[0];
firstItem.set('FirstName','The updated Name');
上記は自動的にフラグをダーティとしてマークし、変更があることをグリッドに通知するので、グリッドは自動的に refresh になります。
また、特定の行に関連するオブジェクトを直接取得する場合は、グリッドの dataItem メソッドを使用できます。
私は非常にシンプルで効果的な方法でそれを行います:
var employee = employeeDataSource.get(employeeId);
employee.dirty = true; // set it as dirty
employeeDataSource.sync(); //Tell the DataSource object to save changes
これは古い質問ですが、同じ問題を抱えている人の助けになることを願っています。
上記のPechkaの回答に続いて、編集済みセルをダーティフラグでマークするコードを追加しました。
これが機能するために列に必要なかみそりのコードは次のとおりです。後でjqueryセレクタで使用できるようにクラス名を追加しました。
columns.Bound(r => r.RoomRate).HtmlAttributes(new { @class = "grid-allotment-roomrate" });
これは、サーバー側からのデータ取得が成功した後にセルを更新し、編集したセルをマークするためのJqueryコードです。
var dataSource = $("#grid-allotments").data("kendoGrid").dataSource;
var data = dataSource.data();
$.each(data, function (index, rowItem) {
var checkbox = $("#checkbox_" + rowItem.RoomTypeId + "_" + rowItem.Date.getTime());
if (checkbox != null && checkbox.is(':checked')) {
$.ajax({
url: "RackRate/GetRackRateForRoomTypeOn",
type: "POST",
data: { roomTypeId: rowItem.RoomTypeId, date: rowItem.Date.toUTCString() },
success: function (result) {
data[index].set('RoomRate', result);
$('tr[data-uid="' + rowItem.uid + '"] .grid-allotment-roomrate').prepend('<span class="k-dirty"></span>');
}
});
}
});
以下は、ダーティフラグの強調表示を担当するコード行です。
$('tr[data-uid="' + rowItem.uid + '"] .grid-allotment-roomrate').prepend('<span class="k-dirty"></span>');
少なくともチェックボックスを使用して、このように使用します。 [編集]ボタンを使用して列を次のように設定します。
columns.Command(command => {command.Edit().HtmlAttributes(new { id = "btnEdit_" + "${Id}" }); }).Width(100).Hidden(true);
そして、最初の列(ハイパーリンク付きの画像がある)をクリックすると、onclick関数を使用してプログラムで[編集]ボタンをクリックし、チェックボックスをクリックしてから[更新]ボタンをクリックします。おそらく「古い学校」ですが、それを自分で更新した場合に実行する順序に従っていることを知っているのが好きです。
オブジェクト( "this")を渡すので、行とチェックボックスが表示されたら、0または1の新しいステータスを取得できます(これを使用するコードがありますが、このデモには実際には必要ありませんが、 「簡単にするためにその部分を私の機能から除外しています)、およびそのアイテムのID:
columns.Bound(p => p.IsActive).Title("Active").Width(100).ClientTemplate("# if (IsActive == true ) {# <a href=javascript:void(0) id=btnActive_${Id} onclick=changeCheckbox(this, '0', ${Id}) class='k-button k-button-icontext k-grid-update'><img style='border:1px solid black' id=imgActive src=../../Images/active_1.png /></a> #} else {# <a href=javascript:void(0) id=btnActive_${Id} onclick=changeCheckbox(this, '1', ${Id}) class='k-button k-button-icontext k-grid-update'><img style='border:1px solid black' id=imgActive src=../../Images/active_0.png /></a> #}#");
function changeCheckbox(obj, status, id) {
var parentTr = obj.parentNode.parentNode;
$('[id="btnEdit_' + id + '"]').click();
parentTr.childNodes[5].childNodes[0].setAttribute("id", "btnUpdate_" + id); // my Update button is in the 6th column over
parentTr.childNodes[0].childNodes[0].setAttribute("id", "chkbox_" + id);
$('[id=chkbox_' + id + ']').click().trigger("change");
$('[id=chkbox_' + id + ']').blur();
var btnUpdate = $('[id="btnUpdate_' + id + '"]');
$('[id="btnUpdate_' + id + '"]').click();
}
上記のコードは、もちろん、チェックボックスが最初の列にあることを前提としています。それ以外の場合、最初のchildNodes[0]
そのchkbox setAttribute行で、それが置かれている列に、ゼロからカウントを開始するため1マイナス。
私にとってこれはうまくいきます(グリッドをインスタンス化する必要はありません):
select: function(e) {
console.log("select");
var item = e.item;
var text = item.text();
var index = item.index();
console.log(item);
console.log(text);
console.log(index);
var dataItem = this.dataItem(index);
console.log(dataItem);
// SET RETURNED VALUES FOR MODEL
options.model.set("actionName.id", dataItem.id);
}
set("fieldname",value)
はグリッドを自動的に更新します。更新を行わずにUI値とフィールド値の両方を更新する簡単な方法が1つあります。ただ、例えば:
data.FieldName = "Whatevervalue";
$(currentrow.children()[getColumnIndex("FieldName")]).text("Whatevervalue");
function getColumnIndex(columnName) {
var index;
var columns = $("#grid").data("kendoGrid").columns;
for (var i = 0; i < columns.length; i++) {
if (columns[i].field == columnName) {
index = i;
return index;
}
}
}
var data = $grid.data("kendoGrid")._data;
var currentrow = $grid.data("kendoGrid").tbody.find("tr[data-uid='" + data[i].uid + "']");
お役に立てれば