首先,您无法通过提供错误的读取URL来伪造空数据源。这只会导致读取错误,并且永远不会触发网格数据源的任何更新(即,dataBound事件永远不会发生)。另一方面,空数据源仍然是有效的数据源,将会触发dataBound事件。
无论如何,这是我的解决方案。首先,为了模拟一个空数据源,我已经设置了数据源,如下所示:
dataSource: []
现在,检查网格是否真正为空的正确方法是读取数据源本身。其他人会通过读取HTML DOM的方式进行更加hacky的操作。请
不要这样做,因为您可能有多个页面、过滤器等等,在数据源中存在但不在DOM中的项目。以下是正确的做法:
if($("#grid").data("kendoGrid").dataSource.data().length===0){
//do your stuff!
}
现在,每次读取数据源时都会触发dataBound事件。因此,您应该将上述代码放在dataBound事件中。检查网格数据源是否为空,然后向用户发送一条消息。这是我的完整dataBound代码。
dataBound: function (e) {
var grid = $("#grid").data("kendoGrid");
var mBox = $("#msgBox");
if (grid.dataSource.data().length === 0) {
if (!mBox.data("kendoWindow")) {
mBox.kendoWindow({
actions: ["Close"],
animation: {
open: {
effects: "fade:in",
duration: 500
},
close: {
effects: "fade:out",
duration: 500
}
},
modal: true,
resizable: false,
title: "No items",
width: 400
}).data("kendoWindow").content("<p>No contacts available. Please try again later.</p>").center().open();
} else {
mBox.data("kendoWindow").content("<p>No contacts available. Please try again later.</p>").open();
}
}
}
上面这一堆是什么鬼?你会注意到我在使用变量
mBox
做很多事情。这只是一个空的
<div>
,我在html页面上添加了id为
msgBox
,我正在使用它来实例化一个
kendoWindow
来创建弹出窗口,告诉用户没有数据。
你可以在这里了解更多关于
kendoWindow。所以,我不再使用丑陋的警报框,而是利用 kendo UI 的另一个部分 - 可自定义和可控制的小部件库。
if
和
else
逻辑与
mBox
简单处理后续调用以显示消息。第一次,kendoWindow 尚未被实例化,因此它通过
if
子句。随后的调用将只重新打开窗口。
试一试 :). 您可以点击下一页按钮以验证它会再次显示弹出窗口。这里是一个 jsFiddle演示。