前文DWZ (JUI) 教程(二):处理信息回馈的通用规范中讲述,将返回信息的处理封装在AjaxObject对象中,例如UserAction中的addUser方法执行成功后,outMsg(AjaxObject.newOk("添加用户成功!").setNavTabId("userListview").toString());表示将在tabId为userListview的tab层提示“添加成功”。
可见在Action中需要设置userListview参数,也就是指明返回数据的目标tab。这样的设计没问题,但是会产生两个问题:
- 实际应用中,我们操作的大都是当前的tab,如果每次向当前tab返回数据时都指定tabId,未免有些过于形式化。
- 如果页面左侧树形菜单是动态的,是从数据库中读取的,并且tabId属性值可以修改,那么outMsg(AjaxObject.newOk("添加用户成功!").setNavTabId("userListview").toString())显然不能满足需求了。
通过修改dwz源码,使得向action返回数据同时刷新当前层,从而无需指定tabId,
以添加用户为例:
原始例子
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<%@ include file="/page/common/common.jsp"%>
<div class="pageContent">
<form method="post" action="${contextPath}/user/addUserAction" class="pageForm required-validate" onsubmit="return validateCallback(this, dialogAjaxDone)">
<div class="pageFormContent" layoutH="58">
<p>
<label>登录名称:</label>
<input type="text" name="user.username" class="required" size="20" maxlength="32"/>
</p>
<p>
<label>登录密码:</label>
<input type="text" name="user.password" class="required" size="20" minlength="6" maxlength="20" value="123456" alt="字母、数字、下划线 6-20位"/>
<span class="info"> 默认:123456</span>
</p>
</div>
<div class="formBar">
<ul>
<li><div class="button"><div class="buttonContent"><button type="submit">确定</button></div></div></li>
</ul>
</div>
</form>
</div>
onsubmit="return validateCallback(this, dialogAjaxDone)",表示注册回调函数dialogAjaxDone,当执行action完毕后会执行该js函数。
action中,需要指定tabId才会刷新页面,outMsg(AjaxObject.newOk("添加用户成功!").setNavTabId("userListview").toString());
将dialogAjaxDone换成自定义dialogReloadNavTab。
action中,无需再指定tabId就会刷新当前层,outMsg(AjaxObject.newOk("添加用户成功!").toString());
dialogReloadNavTab函数实现:
/**
* 得到当前活动的navtab
* @returns
*/
function getCurrentNavtab(){
return $("ul.navTab-tab li.selected");
}
/**
* 自动刷新当前活动的navTab
* @param json
*/
function dialogReloadNavTab(json){
DWZ.ajaxDone(json);
var tabId = getCurrentNavtab().attr("tabid");
if (json.statusCode == DWZ.statusCode.ok){
if (json.navTabId || tabId!=null){
navTab.reload(json.forwardUrl, {navTabId: json.navTabId});
} else if (json.rel) {
var $pagerForm = $("#pagerForm", navTab.getCurrentPanel());
var args = $pagerForm.size()>0 ? $pagerForm.serializeArray() : {}
navTabPageBreak(args, json.rel);
}
if ("closeCurrent" == json.callbackType) {
$.pdialog.closeCurrent();
}
}
}
想要看懂web框架,甚至自己设计,js和jquery是基础,推荐学习w3cschool。