1

情况: 我扩展了一个网格,并添加了一个 onkeydown 事件来监听选项卡或箭头,这将允许用户转到下一个“可编辑”单元格。我这样做使用...

var grid = $("#" + that.gridId).data('kendoMyExtension');
grid.closeCell(currentCell); 
grid.editCell(desiredCell);

当前行为: 它按预期工作,但是当单元格关闭时,它不会将数据(通过正确的绑定)保存到它所绑定的 ViewModel.Field 中。...但是,您在进行更改后按 Enter 键,您将保留更改。

我尝试过的: 在我进行焦点更改(并启动所有其他剑道编辑工具)之前手动进行更新,使用

{grid Context}
that.saveRow();
that.dataSource.sync();

但是这些不起作用。并且通常最终会在剑道的某个地方抛出一个未定义的错误。

我想要的是:

理想情况下,kendo 将提供至少一个 MVVM 和 kendo 扩展示例(用于网格),该示例具有绑定到的所有功能、事件等......但是......因为我可能不会在这里得到这个要求,所以我会满足于:

  1. 剑道在哪里“存储”这些变化?
  2. 使用什么方法来实际调用更新{对于 MVVM 绑定而不是数据源}。
  3. 我是否错过了 {one-way, two-way} 精神的绑定关键字?
  4. 剑道是基于淘汰赛的吗?我可以使用淘汰赛技术来解决我在剑道方面遇到的问题吗?

这个网格上的显示逻辑还有很多其他修改。我正在使用一个模板来确定单元格是否应该是可编辑的,一个模板来确定应该在非编辑和编辑模式下呈现什么,以及一些 IOC 逻辑将其连接到扩展...(仅供参考)

4

1 回答 1

1

好的,通过剑道后,我发现了问题......我的数据源没有阅读器(而且它不应该是 afik),因此同步和 saveRow 将无法可靠地工作。


您必须确保该行在您的编辑模板中标记为“k-edit-row”:

{your edit template selector}.closest('tr').addClass("k-grid-edit-row");

如果你想让 saveRow 工作,但是在我的情况下它不可靠(只有当我通过代码时它才会工作,否则每次都会失败......我不知道为什么甚至尝试过流行的'setTimeout(...)' ....) 最终这就是我最终要做的:

myOnKeyDown:function(e){
    var cell = $(e.target).closest("td")[0];
    var row = $(e.target).closest("tr")[0];
    if (cell != undefined) {
        that.forceSync(cell, row, e.target.value);
    }
},


forceSync: function (cell, row, value){
    /// this is in the extension scope /////
    ///  Note that this uses functions in the dataSource Scope! ///
    var cellFieldName = cell.kendoBindingTarget.target.options.fields.field;
    var cellRecordUid = row.getAttribute('data-uid');
    var that = $("#" + this.gridId).data('kendoMyExtension').dataSource, idx, length;
    var data = that._flatData(that._data);
        for (idx = 0, length = data.length; idx < length; idx++) {
            if(data[idx].uid ===cellRecordUid){
                data[idx][cellFieldName] = value;
            }
        }
    },

......在花费了相当多的时间之后,我觉得其他人应该受益......

真的希望它可以帮助别人.. - 干杯。

于 2013-06-19T22:57:57.403 回答