23

我只是想知道如何在 JavaScript 中更改网格中一行的值,以便在网格和底层数据源中将其标记为“脏”。

例如,我有一个联系人/客户列表。他们有 3 个字段 FirstName/LastName/IsPrimaryContact。只能有 1 个主要联系人,因此当记录上的主要联系人设置为 true 时,我有 JavaScript 代码循环遍历数据源并将任何其他联系人设置为主要联系人设置为 false。

JavaScript 一切正常,数据字段设置正确,但有两个问题: 1. 网格没有随着我在后台对数据源所做的更改而更新 2. 更改的记录未标记为“脏”,因此当我调用 Datasource.sync() 时没有同步回来

我可以通过手动设置记录上的脏字段来解决第二个问题,但这似乎不对。感觉我应该在网格级别更新字段,以便它在 UI 和数据源中处理它。

关于如何解决这个问题的任何想法?

谢谢

4

6 回答 6

43

基本上,当您想要更新记录时,您应该使用模型的set方法。例如,要更新 dataSource 的第一条记录,您应该像这样更新它:

var firstItem = $('#GridName').data().kendoGrid.dataSource.data()[0];
firstItem.set('FirstName','The updated Name');

上面应该自动将标志标记为脏,它会通知 Grid 有更改,因此 Grid 将自动刷新

此外,如果您想直接检索与特定行相关的对象,您可以使用 Grid 的dataItem方法。

于 2012-11-11T07:33:54.257 回答
7

我以一种非常简单有效的方式做到这一点:

 var employee = employeeDataSource.get(employeeId);
     employee.dirty = true;  // set it as dirty
     employeeDataSource.sync();  //Tell the DataSource object to save changes

这是一个老问题,但希望它可以帮助任何有同样问题的人。

于 2014-09-24T13:12:31.573 回答
4

在上面的 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>');
于 2013-01-12T04:33:43.310 回答
2

我以这种方式使用它 - 至少使用复选框。我将使用“编辑”按钮设置列,如下所示:

columns.Command(command => {command.Edit().HtmlAttributes(new { id = "btnEdit_" + "${Id}" }); }).Width(100).Hidden(true);

并在单击第一列的位置(我有一个带有超链接的图像)使用 onclick 函数以编程方式单击“编辑”按钮,单击复选框,然后单击“更新”按钮。可能更“老派”,但我喜欢知道它遵循我自己更新它时的顺序。

我传入对象(“t​​his”),所以当它出现时,我可以获取行和复选框,新状态为 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 行上的第一个调整为它所在的列,减一,因为它从零开始计数。

于 2014-10-22T05:06:17.027 回答
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);
         }
于 2014-11-26T12:10:45.440 回答
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 + "']");

希望这可以帮助

于 2015-03-09T15:22:11.540 回答