2017-06-02 117 views
2

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

我已经扩展了教程preserve dirty indicators以包括dataSource.change事件期间对value字段附加验证:

  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;}

随着这些变化应用中,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)被触发,并且还可以看到正在提供的适当值和正确的返回值(我认为应该设置该值/删除相应单元格中的“脏标志”):

function dirtyField(data, fieldName){ 
    if(data.dirty && data.dirtyFields[fieldName]){ 
     return "<span class='k-dirty'></span>" 
    } 
    else{ 
     return ""; 
    } 
} 

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

这是一个Dojo example来演示这个问题。为了复制:

  • 输入一个大于0的值到第二行value小区(设置“脏标志”)
  • 来自第二行value小区删除值(“脏标志”保留 - >现在应该基于change事件逻辑)消失
  • 输入一个大于0的值到第三行value细胞(套“脏标志”上当前小区,从第二行value小区)
删除“脏标志”

回答

1

在网格单元关闭之前调用您的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(); 
    } 
}); 

这里正在例如使用事件日志记录,这是怎么回事的好understangind。见JS控制台:

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

+1

感谢@sasha_gud,演示工作正常。出于某种原因,我似乎无法触发我的网格定义上的'cellClose()'事件。你知道这是否是一个版本问题('cellClose'仅适用于特定版本)/作为一个冲突的网格属性? **编辑**更改您发送的演示中控件的版本以匹配我自己的版本,并且确实与控件的版本有关。 – Sandman