`
raymond.chen
  • 浏览: 1419821 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

自定义标签:联动下拉框(二)

阅读更多

四、下拉框数据获取方法的源代码

public String findOptions() throws Exception{
	String entityName = getRequest().getParameter("_ENTITY");
	String keyField = getRequest().getParameter("_KEY");
	String descField = getRequest().getParameter("_DESC");
	String orderBy = getRequest().getParameter("_ORDER_BY");
	
	StringBuffer sb = new StringBuffer("");
	sb.append("from " + entityName);
	
	Map paramMap = RequestUtil.getParameterMap(getRequest(), "_CHAIN_PARAM_");
	if(paramMap.keySet().size() > 0){
		int paramCount = paramMap.keySet().size();
		int count = 0;
		for(Iterator it=paramMap.keySet().iterator();it.hasNext();){
			count++;
			if(count == 1){
				sb.append(" where ");
			}else{
				sb.append(" and ");
			}
			
			String key = (String)it.next();
			String value = String.valueOf(paramMap.get(key));
			
			if(CommonUtil.isEmpty(value) || value.equals("null")){
				sb.append(key.replaceFirst("_CHAIN_PARAM_", "") + " is null ");
			}else{
				sb.append(key.replaceFirst("_CHAIN_PARAM_", "") + "='" + value + "' ");
			}
		}
	}
	
	if(CommonUtil.isNotEmpty(orderBy)){
		sb.append(" order by " + orderBy);
	}
	System.out.println(sb.toString());
	
	List optionsList = getBaseService().find(sb.toString());
	getValueStack().set("optionsList", optionsList);
	getValueStack().set("keyField", keyField);
	getValueStack().set("descField", descField);
	
	return SUCCESS;
}

 

五、JS源代码

//下拉框联动选择事件
var chainSelectEvents = new Array();

function addInitChainSelectEvent(e){
	chainSelectEvents[chainSelectEvents.length] = e;
}

window.onload = function(){
	for(var i=0; i<chainSelectEvents.length; i++){
		eval(chainSelectEvents[i]);
	}
}

function chainSelect(selectName, paramStr){
	var objSelect = document.all[selectName];
	if(objSelect == null) return;
	
	var entityName = objSelect.entityName;
	var keyField = objSelect.keyField;
	var descField = objSelect.descField;
	var orderBy = objSelect.orderBy;
	var childSelectName = objSelect.childSelectName;
	var currentValue = objSelect.currentValue;
	var allowEmpty = objSelect.allowEmpty;

	//构造URL
	var url = "findOptions.action?_ENTITY=" + entityName + "&_KEY=" + keyField + "&_DESC=" + descField;
	if(orderBy != null && orderBy.length > 0) url += "&_ORDER_BY=" + orderBy;
	if(paramStr != null && paramStr.length > 0) url += "&" + paramStr;
	
	//Ajax
	jQuery.get(url, function(data){
		jQuery("select[name=" + selectName + "]").empty();
		
		var initIndex = 0;
		if(allowEmpty == "true"){
			initIndex = 1;
			jQuery("select[name=" + selectName + "]").append("<option value=''></option>");
		}
		
		var xmlObject = new ActiveXObject("MSXML.DOMDocument"); 
        		xmlObject.async = false;   
        		xmlObject.loadXML(data);
        
		//fill data into select
		var selectedIndex = 0;
		jQuery(xmlObject).find("option").each(function(i, n){
            			var key = jQuery(n).attr("key");
            			var desc = jQuery(n).attr("description");
            			objSelect.options[i+initIndex] = new Option(desc, key);
            			if(key == currentValue) selectedIndex = i+initIndex;
        		});
        		objSelect.options[selectedIndex].selected = true;
		
		//chain child select
		if(childSelectName != null && childSelectName.length > 0){
		bindChangeFunction(selectName, childSelectName);
		}
      	});
}

//绑定onChange事件
function bindChangeFunction(selectName, childSelectName){
	jQuery("select[name=" + selectName + "]").bind("change", function(){
		var parentKey = jQuery("select[name=" + selectName + "]:first").val();
		var params = jQuery("select[name=" + childSelectName + "]:first").attr("params");
		var pStr = params.replace("#PARENT_KEY#", parentKey);
		chainSelect(childSelectName, pStr);
	});
	jQuery("select[name=" + selectName + "]").trigger("change");
}

 

六、下拉框数据模板源代码

<?xml version="1.0" encoding="UTF-8"?>
<options>
<#list optionsList as item>
	<#assign key = "item.${keyField}">
	<#assign desc = "item.${descField}">
	<option key="${key?eval}" description="${desc?eval}"/>
</#list>
</options>

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics