作为一名设计师,当没有数据可以显示时,我是一个美丽的“空状态”消息概念的忠实粉丝,鼓励用户采取行动。 (事实上,有一个完整的tumblr博客致力于此:http://emptystat.es/)
作为Flexigrid的一个快乐且忠实的用户,我希望能够在我正在构建的系统没有任何搜索结果显示在网格中时替换空状态消息(例如“你有没有待处理的请求!单击“新建”开始。“)。理想情况下,这样的空状态消息将是图形的并且比单个行更大并且将替换网格的整个内容。任何人都可以提供一些关于如何在没有返回行时用图形空状态消息替换flexigrid内容的建议吗?
谢谢!
答案 0 :(得分:0)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Flexigrid</title>
<link rel="stylesheet" type="text/css" href="../css/flexigrid.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="../js/flexigrid.js"></script>
</head>
<body>
<p>This is a sample implementation attached to a form, to add additional parameters.</p>
<form id="sform">
<p>
The values you entered will be place in name column for demo's sake.<br />
Value 1 : <input type="text" name="val1" value="" autocomplete="off" /><br />
Value 2 : Is a hidden input with value 3<input type="hidden" name="val2" value="3" /><br />
Value 3 :
<select name="val3">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select><br />
Value 4 : <input type="checkbox" name="val4" id="val4" value="4" /><label for="val4">This will pass a value 4 if checked</label>
</p>
<p>
<input type="submit" value="Submit" />
</p>
</form>
<button onclick=hide()>HIDE</button>
<button onclick=show()>SHOW</button>
<table id="empty1" style="display:none">
<tr><td><b>Please</b> <u>fill some</u> data</td></tr>
</table>
<table id="flex1" style="display:block">
<tr><td>1</td></tr>
<tr><td>2</td></tr>
<tr><td>3</td></tr>
</table>
<script type="text/javascript">
var old = undefined
function hide() {
if (old == undefined) {
old = flex1.innerHTML
flex1.innerHTML = empty1.innerHTML
}
}
function show() {
if (old != undefined) {
flex1.innerHTML = old
old = undefined
}
}
$("#flex1").flexigrid({
url: 'post2.php',
dataType: 'json',
colModel : [
{display: 'ISO', name : 'iso', width : 40, sortable : true, align: 'center'},
{display: 'Name', name : 'name', width : 180, sortable : true, align: 'left'},
{display: 'Printable Name', name : 'printable_name', width : 120, sortable : true, align: 'left'},
{display: 'ISO3', name : 'iso3', width : 130, sortable : true, align: 'left', hide: true},
{display: 'Number Code', name : 'numcode', width : 80, sortable : true, align: 'right'}
],
searchitems : [
{display: 'ISO', name : 'iso'},
{display: 'Name', name : 'name', isdefault: true}
],
sortname: "iso",
sortorder: "asc",
usepager: true,
title: 'Countries',
useRp: true,
rp: 15,
showTableToggleBtn: true,
width: 700,
onSubmit: addFormData,
height: 200
});
//This function adds paramaters to the post of flexigrid. You can add a verification as well by return to false if you don't want flexigrid to submit
function addFormData(){
//passing a form object to serializeArray will get the valid data from all the objects, but, if the you pass a non-form object, you have to specify the input elements that the data will come from
var dt = $('#sform').serializeArray();
$("#flex1").flexOptions({params: dt});
return true;
}
$('#sform').submit(function (){
$('#flex1').flexOptions({newp: 1}).flexReload();
return false;
});
</script>
</body>
</html>
答案 1 :(得分:0)
我使用dojo解决了这个问题,因为我们已经在我们的网站中使用了这个框架。我确信在不同的库中有类似的解决方案。基本上我创建了一个新类,在创建flexigrid之后,如果指定了一个数据,则注意到flexigrid中是否有数据,如果指定了一个,则将背景图像放入表中:
dojo.provide("app.components.EmptyStateFlexigrid");
dojo.require("dijit._Widget");
// Provides a custom Flexigrid with an empty-state
dojo.declare("app.components.EmptyStateFlexigrid", [dijit._Widget], {
emptyStateUrl: null,
id: null,
url: null,
colModel: null,
buttons: null,
sortField: null,
sortOrder: null,
height: null,
usePager: null,
resizable: null,
// Create the flexigrid object
makeGrid: function() {
var gridObj = $('#' + this.id + "_flexigrid");
gridObj.flexigrid({
url: this.url,
dataType : 'json',
colModel : this.colModel,
buttons : this.buttons,
sortname : this.sortField,
sortorder : this.sortOrder,
height: this.height,
usepager : this.usePager,
resizable: this.resizable,
onSuccess: this.checkEmptyState,
useRp : true,
rpOptions: [2, 10, 15, 20, 30, 50],
rp : 15,
showTableToggleBtn : false
});
}
},
// EMPTY-STATE: make a nice graphic here if there is no data
// Note that "this" is a flexigrid object
checkEmptyState: function() {
var self = dijit.byId(this.id);
var gridObj = $('#' + this.id + "_flexigrid");
if (gridObj[0].id === this.id + '_flexigrid') {
var gridChildren = gridObj.children();
if (gridChildren.length === 0) {
var gblocks = $(".gBlock");
for (var i = 0; i < gblocks.length; i++) {
var styleObj = gblocks[i].style;
// The only way I could find to identify "our" flexigrid (if there is
// more than one on the page) is to test to see if the height is the
// same as our height. Kind of a lousy hack, but the best I could figure
// out. -pbanka
if (styleObj.height == self.height + 'px') {
styleObj.backgroundSize = "450px";
styleObj.backgroundRepeat = "no-repeat";
styleObj.backgroundImage = "url('" + self.emptyStateUrl + "')";
}
}
}
}
},