网格“脏”标志不更新

时间:2017-06-02 13:47:20

标签: javascript jquery kendo-ui kendo-grid kendo-datasource

我在手动设置/删除Kendo网格控件上的“脏标志”指示器时遇到问题。

我已将教程扩展到preserve dirty indicators,以便在value事件期间在dataSource.change字段中包含其他验证:

  1. 以前保存的value(其中包含id)已被修改为0 - 此 是有效的“脏标志”(e.items[0].id > 0 && e.items[0].value === 0
  2. 输入的value的值大于0 - 此 是有效的“脏标志”(e.items[0].value > 0
  3. value 的任何其他实例不是有效的“脏标志”,因此应删除
  4. 如果用户已将value字段设为“空白”,即“空”,请将值修改为0(if (!e.items[0].value) {e.items[0].value = 0;}
  5. 应用这些更改后,change事件现在如下所示:

    change: function (e) {
        if (e.action == "itemchange") {                
            if ((e.items[0].id > 0 && e.items[0].value === 0) || e.items[0].value > 0) {
                e.items[0].dirtyFields = e.items[0].dirtyFields || {};
                e.items[0].dirtyFields[e.field] = true;
                _dirty = true;
            }
            else {
                if (!e.items[0].value) {
                    e.items[0].value = 0;
                }
                e.items[0].dirty = false;
                e.items[0].dirtyFields = e.items[0].dirtyFields || {};
                e.items[0].dirtyFields[e.field] = false;
            }
            $("#grid").data("kendoGrid").refresh();
        }
    }
    

    进行这些更改后,我可以看到dirtyField函数(值列的template)被触发,还可以看到相应的true / {{1提供的值和适当的返回(我认为应该从适当的单元格中设置/删除“脏标志”):

    false

    但是,在修改网格中的另一个单元格之前,不会删除“脏标志”。

    这是展示问题的Dojo example。为了复制:

    • 在第二行function dirtyField(data, fieldName){ if(data.dirty && data.dirtyFields[fieldName]){ return "<span class='k-dirty'></span>" } else{ return ""; } } 单元格中输入大于0的值(设置“脏标志”)
    • 删除第二行value单元格中的值(“脏标志”仍为 - &gt;现在应根据value事件逻辑消失)
    • 在第三行change单元格中输入大于0的值(在当前单元格上设置“脏标志”,从第二行value单元格中删除“脏标志”)

1 个答案:

答案 0 :(得分:2)

在网格单元格关闭之前调用您的DataSource.change事件。因此,刷新网格和单元格更改未在UI中正确反映。

您应该将网格刷新移动到网格cellClose事件。然后在单元格关闭后调用网格刷新,一切正常。

$("#grid").kendoGrid({
    dataSource: dataSource,
    sortable: true,
    pageable: true,
    navigatable: true,
    height: 400,            
    columns: [
        { field: "value", title: "Value", editor: decimal_NumberEditor, format: '{0:n2}', attributes: { class: "editable-cell" }, template: "#=dirtyField(data,'value')# #:value#" }],
    editable: true,
    cellClose: function(e) {
        $("#grid").data("kendoGrid").refresh();
    }
});

以下是事件记录的工作示例,以便更好地了解正在发生的事情。请参阅JS控制台:

http://dojo.telerik.com/ICIxUX/7