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