阻止datagrid填充已经获取到的远程数据
时光流逝,弹指挥间,不经意的一年又如路上一个动人的靓影悄然消失在视线里。我们往往都是先问自己,我们收获了什么,然后才想到我们付出了什么,很少有人先问自己这一年付出了什么,然后再去看所得。话不多说了,祝靠着搜索引擎来到此地的同仁们,在2013年能够大付出,然后大收入。
当datagrid设置了url属性,表格就会通过ajax向设置的url请求数据,然后把请求的数据放到已经渲染好的表格容器中,整个过程我们可以这样简单地表示:

上图的几点说明:
- onBeforeLoad事件发生在ajax请求之前的,这个事件函数如果返回false的话,将直接结束,不会请求数据。
- onLoadError事件是当ajax请求出现故障时触发,开发者可以在此事件中自定义提示信息等。
- onBeforeRender事件是view属性的,该事件发生在把ajax请求到的数据填充到表格内容中之前。
- 红色部分的rend数据行,就是把ajax请求到的数据填充到表格内容里,这个操作是调用view的render方法实现的。
- onAfterRender事件也是view对象的事件,该事件在数据填充到表格之后触发。
- view对象是全局性的,就是说当前页面,所有datagrid对象公用这个view,这是由闭包与面向对象特性决定的,我们来看datagrid的鱼源码:
/**
* 自动运行的匿名函数
* @param {Object} _1b6
* @param {Object} _1b7
* @param {Object} _1b8
*/
(function($){
//view为匿名函数的内部变量,其指向一个对象。
var view = {
render: function(_1b6, _1b7, _1b8){
//...
},
renderFooter: function(_1bf, _1c0, _1c1){
//...
},
renderRow: function(_1c4, _1c5, _1c6, _1c7, _1c8){
//...
},
refreshRow: function(_1ce, _1cf){
//...
},
updateRow: function(_1d0, _1d1, row){
//...
},
insertRow: function(_1d7, _1d8, row){
//...
},
deleteRow: function(_1e2, _1e3){
//...
},
onBeforeRender: function(_1e8, rows){
//user defined
},
onAfterRender: function(_1e9){
//...
}
};
//将匿名函数的内部变量赋给$.fn.datagrid.defaults全局对象
//这样就构成了闭包,匿名函数内的view变量在匿名函数的运行结束后继续存在于内存中。
$.fn.datagrid.defaults = $.extend({}, $.fn.panel.defaults, {
//...
view: view
//...
});
})(jQuery);所以,如果我们更改某个表格的view.onBeforeRender属性的话,其实就是对全局对象的更改,除非我们直接覆盖某个表格的view指向,这样就不会影响其它表格的view了:
$('#tt').datagrid('options').view.onBeforeRender = function(jq,rows){};//这样就改变了全局变量,对别的grid也会造成影响
$('#tt').datagrid('options').view = {onBeforeRender :function(jq,rows){},...};//这样只改变了tt表格的view,对别的grid不会造成影响 - onLoadSuccess事件发生最后,这时候数据已经填充到表格,木已成舟,已无回天之力,除非重新砍木头。
- 在数据填充到表格后,datagrid还有一件事要做,那就是刷新分页工具栏的总记录数值。
我们可以看到,整个过程中,我们唯一有机会阻止ajax加载到的数据填充到表格的地方就是onBeforeRender事件,只要在这个事件里面,我们将数据设置为空,不过也就没有内容可以填充了;
我们可以直接覆写某个表格的view,不过代码量太大,所以更改全局的view对象的onBeforeRender事件更为简洁,因view对象是公用的,你更改的话,那么在当前页面,所有表格的view就都跟着改了,所以在view的onBeforeRender最好是通过入参的id标识用以标识哪些表格需要阻止特定数据填充到内容区,所以,我们在页面文档装载完做以下定义:
$(function() {
$.fn.datagrid.defaults.view.onBeforeRender = function(ele, rows) {
if (ele.id == 'test') {// 只处理id为test的表格
if (rows.length && rows[0].key == -1) {// 这地方我们假设回台返回的数据key为-1的话,则代表此次请求的数据均为错误提示信息,不与展示。
$(ele).data('datagrid').data = {
total : 0,
rows : []
};
alert(rows[0].error);// 用弹出窗口方式通知用户获取数据出错。
}
}
}
});
到这里,我们只剩下一个问题了,那就是分页栏还是显示有一条或多条数据,而根据代码的流程图我看可以看出分页栏的刷新是放在最后的,是不是就没辙了呢?别担心,我们有setTimeout这个法宝,在onLoadSuccess事件里面我们延时刷新一下分页栏就行了:
onLoadSuccess:function(data){
setTimeout(function(){
var page = $('#test').datagrid("getPager");
page.pagination('refresh',{total:0});
},100);
}
是不是有的童鞋要喊了:“既然分页条能延时刷新,那表格的内容也可以延时清空啊。”,不错表格内容是可以通过延时的方式来清空,但是这个过程用户的眼睛一直盯着表格内容,其展示和被清空的过程被用户看得一清二楚。而分页栏是死角,没人会在意,这就是区别。
到这里,我们也就算是完美地完成我们想要的效果了,善于思考的同学肯定会问,为什么要用这么别扭的方式,后台报错就直接不要返回什么数据,都放在onLoadError事件里提示不就得了。
事实上大多人也将异常放在onLoadError中处理的,只有少数情况才会对后台返回的数据有特殊要求,此文更重要的目的是讲述datagrid组件url方式加载和填充数据的过程。
阻止datagrid填充已经获取到的远程数据的更多相关文章
- Html登录表单阻止自动填充
设置属性 autocomplete="off" 阻止浏览器从cache获取数据填充登录表单. <input type="text" name=" ...
- .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】
1.首先在前台dataGridview属性中增加onRowDataBound属性事件 2.然后在后台Observing_RowDataBound事件中增加代码 protected void Obser ...
- Linux中Curl命令couldn't connect to host解决方案 php操作Curl(http,https)无法获取远程数据解决方案
本人在做百度账户第三方登录接口,获取百度token,利用php操作curl post方式发送请求token,出现couldn't connect to host错误.经过调试测试,最后终于成功.回头写 ...
- WPF DataGrid获取选择行的数据
在WPF中,单击DataGrid,如何获取当前点击的行? 比如在MouseDoubleClick事件中,事实上获取的选中行是一个DataRowview,你可以通过以下的方法来获取选中行的数据,需要引用 ...
- Flutter获取远程数据 刷新UI界面
import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; void main() => r ...
- EasyUI queryParams属性 在请求远程数据同时给action方法传参
http://www.cnblogs.com/iack/p/3530500.html?utm_source=tuicool EasyUI queryParams属性 在请求远程数据同时给action方 ...
- jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据
jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等. $.ajax() ...
- rsync+inotify实现远程数据备份
一.rsync的基本介绍 1. 什么是rsync Rsync是一款开源的.快速的.多功能的.可以实现增量的本地货远程数据镜像同步备份的优秀工具,Rsync使用与unix,linux,windows等 ...
- [置顶]
Xamarin android 调用Web Api(ListView使用远程数据)
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...
随机推荐
- NMS:Non-maximum Suppression学习笔记
非极大值抑制可看成一种局部极大值搜索,这里的局部极大值要比他的邻域值都要大.这里的邻域表示有两个参数:维度和n-邻域.维度有1-D,2-D,3-D...:至于n值根据具体情况设置.举个例子:一维的情况 ...
- C++中不可重载5个运算符
C++中不可重载的5个运算符 C++中的大部分运算符都是可以重载的,只有以下5个运算符不可以重载,他们是: 1 .(点运算符)通常用于去对象的成员,但是->(箭头运算符),是可以重载的 2 ...
- day18-事务与连接池 2.事务介绍与mysql下事务操作
这么玩 真的变了吗?把cmd窗口关闭了看看. 就是固定的套路才行:start transaction->执行SQL->rollback; 执行每一条SQL之前都要start transac ...
- 一个jquery在不同浏览器下的兼容性问题。
<div id ='pdiv' style='visibility:hidden;'> <div id='cdiv'>子元素</div> </div> ...
- 10-python中的requests应用
使用request方便: #_*_ coding: utf-8 _*_ ''' Created on 2018年7月14日 @author: sss ''' import requests impor ...
- R 如何 隐藏坐标轴
x = c(7,5,8)dim(x)<-3names(x)<-c("apple","banana", "cherry")plot ...
- Django框架 之 Pagination分页实现
Django框架 之 Pagination分页实现 浏览目录 自定义分页 Django内置分页 一.自定义分页 1.基础版自定义分页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- Java Thread.join()详解--父线程等待子线程结束后再结束
目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 join是Th ...
- 状态压缩-----HDU1074 Doing Homework
HDU1074 Doing Homework 题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当 ...
- Tomcat与Web.xml配置
1.编码配置 <Connector acceptCount=”100″ connectionTimeout=”20000″ disableUploadTimeout=”true” enableL ...