kendo-datasource autoSync 导致导航占位符 return 到网格的左上角

kendo-datasource autoSync causes navigation placeholder to return to upper left corner of the grid

我正在使用 kendo-ui 和 angularJS 1.5,我有一个简单的 kendo-grid 绑定到数据源,传输配置使用函数如下:

private buildDataSource() {
    this.dataSource = new kendo.data.DataSource({
        autoSync: true,
        change: this.dataSourceChangeHandler.bind(this),
        error: this.dataSourceErrorHandler.bind(this),
        transport: {
            read: this.dataSourceRead.bind(this),
            create: this.dataSourceCreate.bind(this),
            update: this.dataSourceUpdate.bind(this),
            destroy: this.dataSourceDestroy.bind(this)
        },
        [...]
    });
}

private dataSourceUpdate(e: kendo.data.DataSourceTransportUpdate) {

    var updatedItem: KendoCosto = e.data;
    [...]
    e.success(updatedItem, undefined, undefined);
}

网格选项如下所示:

        this.gridOptions = {
            dataSource: this.dataSource,
            change: this.gridChangeHandler.bind(this),
            editable: {
                mode: "incell",
                confirmation: false
            },
            navigatable: true,
            selectable: "multiple, cell",
            allowCopy: true,
            toolbar: [
                "create"
            ],
            [...]

网格工作正常,读取、创建、更新、销毁的行为符合预期。 我的问题是,每当我更改网格单元格中的值并按回车键时,我都希望键盘导航 "placeholder"(网格具有可导航的:true)保留在已编辑的单元格上,但它恰好被移动了到左上角的单元格。 只有当 dataSource 的 autoSync 设置为 true 时才会发生此行为。 我还尝试通过网格 api 的“.current”方法 "set" 当前单元格,但它似乎不起作用:

    // this is bound to the grid's change event and it is supposed to
    // store the currently selected cell in a property of the class
    // that builds both the datasource and the grid
    private gridChangeHandler(e: kendo.ui.GridNavigateEvent) 
    {
        this.thisGrid = this.thisGrid || e.sender;
        this.currentCell = e.sender.current();
    }

    // Then on the change event of the datasource I do
    private dataSourceChangeHandler(event: kendo.data.DataSourceChangeEvent)            
    {
        if (this.currentCell && this.thisGrid) {
            this.thisGrid.select(this.currentCell);
            this.currentCell = undefined;
        }
    }

有什么建议吗?

提前致谢!

--- 编辑 ---

我posted/pasted在评论中的代码绝对不可读所以我在这里重复代码:

为了让您的解决方案生效,我不得不以这种方式修改我的 dataBound 处理程序。

private gridDataBoundHandler(e: kendo.ui.GridDataBoundEvent) { 
    if (this.thisGrid && this.currentCell) { 
        setTimeout((() => { 
            // this.thisGrid.editCell(this.currentCell);    
            this.thisGrid.current(this.currentCell); 
        }).bind(this)
        , 10); 
    }
} 

没有超时,导航占位符仍然重置回左上角。

首先,我认为网格更改事件是错误的附加事件,因为它仅在用户使用鼠标选择 row/cell 时触发...它不会在选项卡事件上触发。

所以,我会使用网格保存事件,它会在您进行编辑后触发,"commit" 通过回车、Tab、鼠标关闭等方式进行更改

其次,e.sender.current()包括当前识别信息,如"grid_active_cell"和"k-state-focused"和"k-dirty-cell"等. 当你到达数据源更改事件时,单元格实际上已经失去了所有装饰,你的 this.currentCell 基本上指向一个不存在的选择器。因此,您需要获取更多 "permanent" 标识符。

因此,使用网格保存事件:

save: function (e) {
    var row = $(e.sender.current()).closest("tr");
    var colIdx = $("td", row).index(e.sender.current());
    var model = e.sender.dataItem(row);
    currentCell = "tr[data-uid='" + model.uid + "'] td:eq(" + colIdx + ")";
}

然后在网格 DATABOUND 事件中(因为 dataSource 更改事件之后仍然是将单元格焦点更改为左上角的事件,但 grid.dataBound 在链中更远并且似乎工作得更好):

dataBound: function (e) {
    if (currentCell) {
        grid.editCell(currentCell);
        grid.current(currentCell);
    }
}

Demo(由于我没有你的整个 class,所以有变量变化,基于 kendo 网格演示):http://dojo.telerik.com/@Stephen/OjAsU

请注意,此解决方案(不是我的实现,而是您的一般技术)将打破单元格之间的制表符,即制表符将提交编辑,但数据源更改事件将始终将焦点放回刚刚编辑的单元格,而不是移动到选项卡式单元格。这打破了用户对选项卡功能的期望。因此,您应该考虑尝试仅捕获回车键按下,而不是依赖于网格事件(无论 tab 还是 enter 都会触发)。