我只是想知道如何在JavaScript中更改网格中行的值,以便在网格和基础数据源中将其标记为“脏”。
e.g。我有联系人/客户列表。他们有3个字段FirstName / LastName / IsPrimaryContact。只能有1个主要联系人,因此当记录中的主要联系人设置为true时,我会使用JavaScript代码循环遍历数据源,并将设置为primary的所有其他联系人设置为false。
JavaScript全部触发正常,数据字段设置正确但有两个问题: 1.网格没有根据我在数据源的引擎下所做的更改进行更新 2.更改的记录未标记为“脏”,因此在调用Datasource.sync()时不会同步回来。
我可以通过在记录上手动设置脏字段来解决第二个问题,但这似乎不正确。感觉我应该在网格级别更新字段,以便在UI和数据源中处理它。
关于如何解决这个问题的任何想法?
由于
答案 0 :(得分:38)
基本上,当您想要更新记录时,您应该使用模型的 set 方法。例如,要更新dataSource的第一条记录,您应该像这样更新它:
var firstItem = $('#GridName').data().kendoGrid.dataSource.data()[0];
firstItem.set('FirstName','The updated Name');
上面应该自动将标志标记为脏,它会通知网格有变化,因此网格将自动refresh。
此外,如果您想直接检索与特定行相关的对象,可以使用网格的dataItem方法。
答案 1 :(得分:5)
我是以一种非常简单有效的方式做到的:
var employee = employeeDataSource.get(employeeId);
employee.dirty = true; // set it as dirty
employeeDataSource.sync(); //Tell the DataSource object to save changes
这是一个古老的问题,但希望它可以帮助任何有同样问题的人。
答案 2 :(得分:4)
按照上面的Pechka回答,我添加了一些额外的代码来标记带有脏标志的已编辑单元格。
这是我的razor代码需要在列上工作,我添加了一个类名,以便稍后可以在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>');
答案 3 :(得分:2)
我用这种方式 - 至少使用复选框。我将使用“编辑”按钮设置列,如下所示:
columns.Command(command => {command.Edit().HtmlAttributes(new { id = "btnEdit_" + "${Id}" }); }).Width(100).Hidden(true);
如果点击第一列(我有一个带超链接的图像),则使用onclick功能以编程方式单击“编辑”按钮,单击复选框,然后单击“更新”按钮。可能更多&#34;旧学校&#34;,但我喜欢知道它遵循我将要做的订单,如果我更新它,我自己。
我传入了对象(&#34;这个&#34;),所以当出现时我可以得到行和复选框,新状态为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();
}
上面的代码假设,当然,复选框位于第一列。否则,将该chkbox setAttribute行的第一个childNodes[0]
调整为它所在的列,减一,因为它从零开始计数。
答案 4 :(得分:2)
对我来说这是工作(不需要实例化网格):
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);
}
答案 5 :(得分:0)
set("fieldname",value)
将自动刷新网格,有一种简单的方法可以更新UI值和字段值,而无需进行刷新。只是做,例如:
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 + "']");
希望这有帮助