论坛首页 Web前端技术论坛

dwrProxy的实现与改进

浏览 2233 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-27   最后修改:2008-12-28

 

/**
 * http://extjs.com/forum/showthread.php?t=19529
 */
/*
 * 作者:彭仁夔 blog:http://jxnuprk.cnblogs.com/或jljlpch.iteye.com
 */
Ext.namespace("Ext.ux.data");

Ext.ux.data.DWRProxy = function(config) {
	Ext.apply(this, config);
	if (!this.dwrFn)
		alert("you must give the dwrFn to run!");
	this.dwrlen = this.dwrFn.toString()/* 取得函数参数 长度 */
	.match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").length - 1;
	if (!this.limitPos)
		this.limitPos = this.dwrlen - 1;
	if (!this.startPos)
		this.startPos = this.dwrlen - 2;
	if (!this.sortPos)
		this.sortPos = this.dwrlen - 3;

	Ext.ux.data.DWRProxy.superclass.constructor.call(this);
};

Ext.extend(Ext.ux.data.DWRProxy, Ext.data.DataProxy, {
	re : /start|limit|sort|dir/,
	noPage : false,
	noSort : true,
	sort : '',
	dir : "",
	start : 0,
	limit : 10,
	load : function(params, reader, loadCallback, scope, arg) {
		var l = this.dwrlen, dwrFnArgs = [], flag, t = {};
		// 隔离短的请求时可能会引起的冲突
		for (var p in this)
			t[p] = this[p];
		if (t.fireEvent("beforeload", t, params) !== false) {
			var loadArgs = params['dwrFnArgs'] || params;
			if (loadArgs instanceof Array) {/* 通过数组传入参数 */
				for (var i = 0;i < loadArgs.length; i++) {
					dwrFnArgs[i] = loadArgs[i];
				}
			} else {
				for (var n in loadArgs) {/* 通过对象传入参数 */
					if (t.re.exec(n)) {
						flag = true;
						t[n] = loadArgs[n];
					} else {
						dwrFnArgs.push(loadArgs[n]);
					}
				}
			}
			// 如果已经取得start,limit,sort等参数就不重复
		if (!flag)
			for (var p in params) {
				if (t.re.exec(p))
					t[p] = params[p];
			}
		// 主要针对于分页时出现的问题
		if (!dwrFnArgs.length) {/* 没有传入参数(不包含分页等) */
			if (t.initParams)/* 看看有没有初始化参数 */
				dwrFnArgs = t.initParams;
			else if (t.lastOptions) /* 看看上次成功的参数 */
				dwrFnArgs = t.lastOptions;
		}
		var l = t.dwrlen, l2 = dwrFnArgs.length;
		// 对不足位的补undefined,如果java中是基本类型,int,float就会出现错误
		for (var i = l2 - 1;i < l; i++) {
			dwrFnArgs.push(undefined);
		}
		// 默认是采用分页,采用
		if (!t.noPage) {
			dwrFnArgs[t.startPos] = t.start;
			// 这里是为了防止分页时出现NAN值
			params.start = t.start;
			dwrFnArgs[t.limitPos] = t.limit;
			params.limit = t.limit;
		}
		if (!t.noSort) {
			var s = t.sort + " " + t.dir
			dwrFnArgs[t.noPage ? l - 1 : t.sortPos] = s;
		}

		var cb = function(response) {
			alert("success!");
			t.lastOptions = dwrFnArgs;
			var records = reader.readRecords(response);
			t.fireEvent("load", t, response, loadCallback);
			loadCallback.call(scope, records, arg, true);
		}

		var eh = function(message, exception) {
			alert(message);
			t.fireEvent("loadexception", t, message, loadCallback, exception);
			loadCallback.call(scope, null, arg, false);
		};
		dwrFnArgs[l] = {// dwr配置参数
			callback : cb,
			exceptionHandler : eh
		};
		t.dwrFn.apply(Object, dwrFnArgs);
	} else {
		loadCallback.call(scope || t, null, arg, false);
	}
}
});

 

   发表时间:2008-12-27   最后修改:2008-12-27
本想采用try catch来进行调整参数,那样太浪费了
不知道有没有很好方法去生成默认的初始化参数?
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics