Kendo mvc grid批处理模式dataItem.set清除脏标志

时间:2013-08-15 13:06:49

标签: asp.net-mvc kendo-ui kendo-grid

当我更改金额时,勾选复选框等,它会触发一些javascript,其中包含一些代码,用于在dataItem上设置另一个字段,因此dataItem.Set ("Amount", 0);

我可以使用dataItem.Amount = 0;设置它,但我还需要更新单元格的内容。当我设置时,我显然不希望从其他单元格清除脏标志,因为我还没有点击“保存更改”,所以它们仍然“脏”。

我找不到.set方法的任何文档。

任何建议都将受到赞赏。

@(Html.Kendo().Grid<OurViewModel>()
.Name("Grid")
.DataSource(dataSource => dataSource
    .Ajax()
    .Model(model =>
    {
        model.Id(a => a.ID);
        model.Field(a => a.Reference).Editable(false);
        model.Field(a => a.Narrative).Editable(false);
        model.Field(a => a.Include).Editable(true);
        model.Field(a => a.Amount).Editable(true);
    })
    .Batch(true)
    .Read(read => read.Action("_Read", "Home"))
    .Update(update => update.Action("_Update", "Home"))
    .ServerOperation(false)
    .Events(events =>
    {
        events.Change("onDataSourceChange");
    })
)
.Columns(columns =>
{
    columns.Bound(a => a.Reference).Title("Reference");
    columns.Bound(a => a.Narrative).Title("Narrative");
    columns.Template(@<text></text>).Title("Include?")
        .ClientTemplate("<input type='checkbox' #= Include ? checked='checked': '' # onclick='updateAmount(this, \"#= ID#\")' />");
    columns.Bound(a => a.Amount).Title("Amount");
})
    .Events(events =>
    {
        events.Save("onSave"); 
        events.SaveChanges("onSaveChanges");
    })
.ToolBar(toolbar =>
{
    toolbar.Save();
})
.Editable(editable => editable.Mode(GridEditMode.InCell))
)    

和JS。

function updateAmount(cb, ourID) {
            var checked = $(cb).is(':checked');
            var grid = $('#Grid').data().kendoGrid;
            var dataItem = grid.dataSource.get(ourID);
            dataItem.set("Include", checked);
            if (checked) {
                dataItem.set("Amount", dataItem.get("OriginalAmount"));
            } else {
                dataItem.set("Amount", 0);
            }
       }

1 个答案:

答案 0 :(得分:0)

在可观察对象上调用set方法时(注意:dataSource中的每个dataItem在加载时转换为kendo ObservableObject)我们绑定到dataItem的任何小部件都将被更新,在这种情况下,您的网格是绑定的小部件。

如果直接设置值(即dataItem.Amount = 0),则不会触发任何可观察对象的绑定事件,并且网格(或绑定到dataItem的任何其他小部件)将不会更新。在修改可观察对象的字段时,应始终使用set,以使UI保持最新状态。

在dataSource中,dataItem中的各个字段没有脏标志。 dataItem本身将有一个名为“dirty”的字段,只要其字段发生任何变化,该字段就会设置为true。更改多个字段只会为整个dataItem设置dirty = true。您无需担心跟踪已修改的字段。一旦脏了,它将保持脏,直到你保存数据。

当你保存网格内容(a.k.a.同步dataSource)时,任何(和唯一)脏行= true的行都将被发送到服务器。保存后,脏标志将被删除。在这方面,您将希望避免在数据库中使用“脏”作为表属性。

kendo documentation at非常完整,但我强烈建议您通过kendo javascript代码进行跟踪,以便真正了解它。最后一点,我开始使用Kendo MVC方法,希望利用C#知识,但很快就发现在JavaScript中编写所有客户端更容易。每次攻击的服务器都会将所有C#代码转换为相当冗长的JavaScript。这会给服务器带来不必要的负担,并使客户端调试更加困难。