首先,您不能仅通过提供不正确的读取 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 here 的更多信息。因此,我没有使用丑陋的警报框,而是利用了 kendo UI 小部件库的另一部分,它是可定制和可控的。
if 和 else 逻辑与 mBox 仅处理后续调用以显示消息。第一次,kendoWindow 没有被实例化,所以它通过if 子句。只需重新打开窗口即可进行后续调用。
试一试:)。您可以单击下一页按钮以验证它是否会再次显示弹出窗口。这是jsFiddle Demo。