2

当我更改金额,勾选复选框等时,它会触发一些 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);
            }
       }
4

1 回答 1

0

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

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

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

当您保存网格的内容(也就是同步数据源)时,任何(且只有)带有dirty = true 的行都将被发送到服务器。保存后,脏标志将被删除。关于这一点,您将要避免在数据库中使用“脏”作为表属性。

此处的剑道文档非常完整,但我强烈建议您跟踪剑道 JavaScript 代码以真正学习它。最后一点,我从 Kendo MVC 方法开始,希望利用 C# 知识,但很快发现用 JavaScript 编写所有客户端代码要容易得多。无论如何,每次访问服务器时,您的所有 C# 代码都会转换为相当冗长的 JavaScript。这会给服务器带来不必要的负载,并使 IMO 客户端调试更加困难。

于 2014-07-30T02:13:17.920 回答