下拉列表级联菜单封装(直接拿来使用)

1 篇文章 0 订阅
1 篇文章 0 订阅


 使用说明
 

var param={
			data:subjectList,	//处理的数据(必选)数据格式:[{object Object},{object Object}] 
			showId:'levelId',//显示的数据标签ID(必选)
			idKey:'subjectId',//数据的ID(必选)
			pidKey:'parentId',//数据的父ID(必选)
			nameKey:'subjectName',//数据显示的名(必选)
			returnElement:'returnId',//返回选中的值(必选 )
			//-----------------------------------------------------
			returnIds:'returnIds',//返回所有级的ID,以“,”隔开(可选)
			initVal:209,//初始默认ID(可选)
			defName:'请选择',//默认显示的选项名(可选,如果不设置默认显示“请选择”)
			defValue:'0'//默认的选项值(可选,如果不设置默认是“0”)
		};
	ML._init(param);




(function(window,undefined){
	//父级链
	var parentNodes=new Array(),prevArr;
	window.ML ={
			_init:initMl
	};
	/**
	 * 初始化数据
	 */
	function initMl(params){
		window.params=params;
		if(!params.defName || params.defName.replace(/ /g,'').replace(/ /g,'')==''){
			params.defName='请选择';
		}
		if(!params.defValue || !(/^\d+$/.test(params.defValue))){
			params.defValue=0;
		}
		if(params.initVal && params.initVal>0){
			showmlMultilevel();
		}else{
			showRoot();
		}
	}
	/**
	 * 显示多级
	 */
	function showmlMultilevel(){
		var nodes = params.data;
		//得到初始化节点
		var node = getItself(params.initVal,nodes);
		if(node==null){
			showRoot();
			return false;
		}
		//得到初始化节点的父节点链
		parentLinkList(node,nodes);
		if(parentNodes.length>0){
			for(var i=0;i<parentNodes.length;i++){
				if(i==0){
					showRoot();
				}else{
					var arr = sameLevel(parentNodes[i],nodes);
					//创建select元素
					createSelect(arr);
				}
			}
			childList(params.initVal);
		}
	}
	
	/**
	 * 只显示根级节点
	 */
	function showRoot(){
		var rootArr = new Array();
		for(var i=0;i<params.data.length;i++){
			var _index=0;
			for(var j=0;j<params.data.length;j++){
				if(params.data[i][params.pidKey]==params.data[j][params.idKey])
				_index=1;
			}
			if(_index==0){
				rootArr.push(params.data[i]);
			}
		}
		//创建select元素
		createSelect(rootArr);
	}
	
	/**
	 * 获取初始化节点
	 */
	function getItself(initVal,nodes){
		for(var i=0;i<nodes.length;i++){
			if(initVal==nodes[i][params.idKey]){
				return nodes[i];
			}
		}
	}
	
	/**
	 * 获取父级链
	 */
	function parentLinkList(node,nodes){
		parentNodes.splice(0,0,node);
		for(var i=0;i<nodes.length;i++){
			if(node[params.pidKey]==nodes[i][params.idKey]){
				parentLinkList(nodes[i],nodes);
			}
		}
		
	}
	
	/**
	 * 获取同级节点
	 */
	function sameLevel(node,nodes){
		var sameArr =new Array();
		for(var i=0;i<nodes.length;i++){
			if(node[params.pidKey]==nodes[i][params.pidKey]){
				sameArr.push(nodes[i]);
			}
		}
		return sameArr;
	}
	
	/**
	 * 创建select元素
	 */
	function createSelect(arr){
		if(arr!=null && arr.length>0){
			var select = document.createElement('select');
			var option = document.createElement('option');
			option.setAttribute('value',params.defValue);
			var text = document.createTextNode(params.defName);
			option.appendChild(text);
			select.appendChild(option);
			for(var i=0;i<arr.length;i++){
				option = document.createElement('option');
				option.setAttribute('value',arr[i][params.idKey]);
				selected(option,arr[i]);
				text = document.createTextNode(arr[i][params.nameKey]);
				option.appendChild(text);
				select.appendChild(option);
			}
			var elem = document.getElementById(params.showId);
			elem.appendChild(select);
			select.onchange = changeSelect;
		}
	}
	/**
	 * 设置选中项
	 */
	function selected(option,node){
		if(parentNodes.length>0){
			for(var i=0;i<parentNodes.length;i++){
				if(node[params.idKey]==parentNodes[i][params.idKey]){
					option.setAttribute('selected','selected');
					break;
				}
			}
		}
	}
	/**
	 * 当选择时调用
	 */
	function changeSelect(){
		if(this.nextSibling){
			deleteNext(this.nextSibling);
		}
		prevArr =new Array();
		//获取同级前面的元素
		prevNodes(this);
		if(this.value>params.defValue){
			childList(this.value);
			document.getElementById(params.returnElement).value=this.value;
		}else{
			if(prevArr.length>0){
				if(prevArr.length>=2){
					document.getElementById(params.returnElement).value=prevArr[prevArr.length-2].value;
				}else{
					document.getElementById(params.returnElement).value=prevArr[prevArr.length-1].value;
				}
			}
		}
		if(params.returnIds){
			var ids='';
			for(var i=0;i<prevArr.length;i++){
				if(prevArr[i].value>params.defValue){
					ids+=prevArr[i].value+',';
				}
			}
			if(ids!=''){
				document.getElementById(params.returnIds).value=','+ids;
			}else{
				document.getElementById(params.returnIds).value='';
			}
			
		}
	}
	/**
	 * 获取子级节点
	 */
	function childList(thisVal){
		var childArr = new Array();
		var _data = params.data;
		for(var i=0;i<_data.length;i++){
			if(thisVal==_data[i][params.pidKey]){
				childArr.push(_data[i]);
			}
		}
		createSelect(childArr);
	}
	/**
	 * 删除当前选择的select后所所有的元素
	 */
	function deleteNext(em){
		if(em.nextSibling){
			deleteNext(em.nextSibling);
		}
		document.getElementById(params.showId).removeChild(em);
	}
	
	/**
	 * 获取前面的元素
	 */
	function prevNodes(em){
		if(em.previousSibling){
			prevNodes(em.previousSibling);
		}
		prevArr.push(em);
	}
})(window);


在 JPA 中,当你要更新一个实体的级联列表时,你可以使用以下两种方式来处理: 1. 使用 merge() 方法:首先,你需要加载要更新的实体对象以及相关的级联列表。然后,对于每一个需要更新的级联列表项,你可以使用 merge() 方法将其添加到实体的列表中。最后,你可以调用 merge() 方法来更新实体对象和级联列表。 下面是一个示例代码: ```java // 加载要更新的实体对象 Entity entity = entityManager.find(Entity.class, entityId); // 加载要更新的级联列表 List<CascadeEntity> cascadeList = entity.getCascadeList(); // 更新级联列表项 CascadeEntity updatedCascade = new CascadeEntity(); // 设置更新后的属性值 // ... // 将更新后的级联列表项添加到实体的列表中 cascadeList.add(updatedCascade); // 更新实体对象和级联列表 entityManager.merge(entity); ``` 2. 使用 orphanRemoval 属性:在实体类的关联注解中,你可以设置 orphanRemoval 属性为 true。这样,当你从级联列表中移除一个项时,该项将被自动删除。 下面是一个示例代码: ```java @Entity public class Entity { // ... @OneToMany(mappedBy = "entity", cascade = CascadeType.ALL, orphanRemoval = true) private List<CascadeEntity> cascadeList = new ArrayList<>(); // ... } ``` 然后,在更新级联列表时,你可以直接修改实体对象的级联列表,并且不需要显式地调用 merge() 方法。当你从级联列表中移除一个项时,JPA 将自动删除该项。 ```java // 加载要更新的实体对象 Entity entity = entityManager.find(Entity.class, entityId); // 更新级联列表 List<CascadeEntity> cascadeList = entity.getCascadeList(); // 移除一个级联列表项 CascadeEntity removedCascade = cascadeList.get(index); cascadeList.remove(removedCascade); // 更新实体对象 entityManager.merge(entity); ``` 使用哪种方式取决于你的具体需求和业务逻辑。你可以根据自己的情况选择适合的方式来处理级联列表的更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值