Kendo ui 剑道UI网格-未执行批更新

Kendo ui 剑道UI网格-未执行批更新,kendo-ui,Kendo Ui,我正在实现一个简单的(至少这是目标)剑道UI网格,它显示两列:一列包含复选框,绑定到布尔值,另一列包含项目的显示名称。复选框列有一个简单的模板,处理复选框的更改()事件,以便更新数据源中的模型。我已经验证了这一点,它是有效的 数据源已为批处理配置,并为读取和更新定义了一个传输。两者都调用执行ajax调用的函数。如前所述,read函数按预期处理。但是,传输上定义的更新功能不可用。数据源上的sync()通过一个简单的按钮触发,该按钮的单击事件连接到一个调用datasource.sync()(或gri

我正在实现一个简单的(至少这是目标)剑道UI网格,它显示两列:一列包含复选框,绑定到布尔值,另一列包含项目的显示名称。
复选框
列有一个简单的模板,处理
复选框
更改()
事件
,以便更新
数据源
中的
模型
。我已经验证了这一点,它是有效的

数据源已为
批处理
配置,并为
读取
更新
定义了一个
传输
。两者都调用执行ajax调用的函数。如前所述,
read
函数按预期处理。但是,
传输
上定义的
更新
功能不可用。数据源上的
sync()
通过一个简单的按钮触发,该按钮的
单击
事件连接到一个调用
datasource.sync()
(或
grid.saveChanges()
)的函数

在Kendo UI代码中进行调试时,模型集上的models属性看起来总是空的,因此
sync()
决定没有要同步的内容。有人知道这里发生了什么吗

更新: 处理复选框
check
/
uncheck
时,似乎有问题。显然我应该用类似的东西

$('#divGrid').on('click', '.chkbx', function() {
    var checked = $(this).is(':checked');
    var grid = $('#divGrid').data().kendoGrid;
    var dataItem = grid.dataItem($(this).closest('tr'));
    dataItem.set("Selected", checked);
});
不幸的是,数据项上似乎没有定义
set()
方法。调试时,它只包含
数据
,没有具有
set()
方法的模型对象

更新2:
尝试将ajax调用返回的数据包装到使用
model.define()
定义的模型中。这似乎解决了模型不脏的问题,因为模型上的_modified属性返回
true
。但是,模型集中的模型数组仍然为空。这是剑道UI中的错误,还是我走错了方向?

您实际上不需要将
绑定到
点击
复选框上的
事件

transport: {
            read: function(options) {
                return loadStuff(options);
            },
            update: function (options) {
                return updateStuff(options);
            }
}
我已经发布了一个在你可以看到它运行的地方使用它的例子。此示例在网格中显示两列:第一列为文本(勾选),第二列为布尔值,呈现为复选框(选中);更新是批处理的(因此,它与您的更新非常接近)

要记住的问题是:

要在不处于编辑模式时显示复选框,您应该定义一个模板,如下所示。您可能会意识到,默认情况下,复选框处于禁用状态,因为您希望将其作为其他字段进行编辑(首先选择单元格)。这还可以确保模型得到正确更新:

{
    field   : "selected",
    title   : "Selected",
    template: "<input type='checkbox' name='selected' #= selected ? 'checked' : '' # disabled/>"
}
定义
transport.update
函数,类似于:

transport: {
    read  : function (operation) {
        // Your function for reading
    },
    update: function (operation) {
        // Display modified data in an alert
        alert("update" + JSON.stringify(operation.data.models, null, 4));
        // Invoke updating function
        // that should ends with an operation.success(the_new_data)
        // In this example just say ok
        operation.success(operation.data.models)
    }
}
编辑:如果您希望能够修改
复选框
状态,而不必首先进入
编辑
模式,您应该:

从模板中删除禁用的

{
    field     : "selected",
    title     : "Selected",
    template  : "<input type='checkbox' name='selected' #= selected ? 'checked' : '' #/>"
},
其中
#stocks_tbl
是包含
网格的
div
id
。你可能会看到它在运行


注意:重要的是
上的
带有三个参数,用于制作它

您实际上不需要将
绑定到
上,单击
复选框上的
事件

transport: {
            read: function(options) {
                return loadStuff(options);
            },
            update: function (options) {
                return updateStuff(options);
            }
}
我已经发布了一个在你可以看到它运行的地方使用它的例子。此示例在网格中显示两列:第一列为文本(勾选),第二列为布尔值,呈现为复选框(选中);更新是批处理的(因此,它与您的更新非常接近)

要记住的问题是:

要在不处于编辑模式时显示复选框,您应该定义一个模板,如下所示。您可能会意识到,默认情况下,复选框处于禁用状态,因为您希望将其作为其他字段进行编辑(首先选择单元格)。这还可以确保模型得到正确更新:

{
    field   : "selected",
    title   : "Selected",
    template: "<input type='checkbox' name='selected' #= selected ? 'checked' : '' # disabled/>"
}
定义
transport.update
函数,类似于:

transport: {
    read  : function (operation) {
        // Your function for reading
    },
    update: function (operation) {
        // Display modified data in an alert
        alert("update" + JSON.stringify(operation.data.models, null, 4));
        // Invoke updating function
        // that should ends with an operation.success(the_new_data)
        // In this example just say ok
        operation.success(operation.data.models)
    }
}
编辑:如果您希望能够修改
复选框
状态,而不必首先进入
编辑
模式,您应该:

从模板中删除禁用的

{
    field     : "selected",
    title     : "Selected",
    template  : "<input type='checkbox' name='selected' #= selected ? 'checked' : '' #/>"
},
其中
#stocks_tbl
是包含
网格的
div
id
。你可能会看到它在运行


注意:使用
上的
和三个参数进行设置非常重要

您好,感谢您的示例。虽然我确实在点击事件上注册了,而且显然不需要注册,但我还是设法做到了您的示例中所提到的程度。我的示例和您的示例仍然存在的问题是,您必须首先单击包含复选框的单元格,然后才能编辑复选框。如果不禁用屏幕初始化复选框,则模型似乎不会得到适当更新。我需要找出如何消除第一次点击…请参阅编辑,以便能够在不进入编辑模式的情况下修改复选框。这是OnaBai的一个很好的回答,他应该得到表扬。我花了很长时间试图让这个工作,解决方案是不清楚的,从Telerik。我应该补充一点,“click”JS不会工作,除非您已经声明了“grid”对象。在我的例子中,这是有效的:
var-dataItem=$('stocks'u-tbl').data('kendoGrid').dataItem($(this.nexist('tr'))嗨,谢谢你的样品。虽然我确实在点击事件上注册了,而且显然不需要注册,但我还是设法做到了您的示例中所提到的程度。我的示例和您的示例仍然存在的问题是,您必须首先单击包含复选框的单元格,然后才能编辑复选框。如果不禁用屏幕初始化复选框,则模型似乎不会得到适当更新。我需要找出如何消除第一个c