KendoUI MVVM绑定手动更新显示值的源

时间:2013-06-18 19:52:39

标签: javascript mvvm grid kendo-ui requirejs

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

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

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

我尝试了什么: 在我使用

进行焦点更改(并关闭所有其他剑道编辑好东西)之前手动进行更新
{grid Context}
that.saveRow();
that.dataSource.sync();
然而,这些不起作用。并且通常最终会在剑道的某处投掷一个未定义的错误。

我想要的是什么:

理想情况下,剑道将提供至少一个MVVM和剑道扩展示例(对于网格),其中包含所有功能,事件等...但是..因为我可能不会在这里询问我会解决for:

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

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

1 个答案:

答案 0 :(得分:1)

o.k。通过剑道踩到后我发现问题......我的数据源没有读卡器(并且它不应该是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;
            }
        }
    },

......经过相当长的一段时间后,我觉得别人应该受益......

真的希望它可以帮助其他人.. -cheers。