dojo:如何用MultiSelect实现类似ListBox风格的FromTo功能

欲实现的功能如下图:

主要要解决的问题包括两个方面:

一个是MultiSelet初始化的工作,一个是FromTo功能按钮的实现。这主要是因为MultiSelect控件是存储无关的,并不像Select或者Combobox那样好用。

下面简单说下流程:

step1: HTML部分

					<table align="center">
						<tr>
							<td >
								<fieldset>
									<legend><font color="red"><b>配置管理</b></font></legend>
										<table align="center">
											<tr>
												<td><select id="fromConfigSelect" ></select></td>
												<td>
													<input type="button" id="fromConfigButton" value=">>" /><br>
													<input type="button" id="toConfigButton" value="<<" /><br>
												</td>
												<td><select id="toConfigSelect" ></select></td>
											</tr>
										</table>
								</fieldset>
							</td>

							<td >
								<fieldset>
									<legend><font color="red"><b>人员管理</b></font></legend>
										<table align="center">
											<tr>
												<td><select id="fromHumanSelect" ></select></td>
												<td>
													<input type="button" id="fromHumanButton" value=">>" /><br>
													<input type="button" id="toHumanButton" value="<<" /><br>
												</td>
												<td><select id="toHumanSelect" ></select></td>
											</tr>
										</table>
								</fieldset>
							</td>

						</tr>
						<tr>
							<td >
								<fieldset>
									<legend><font color="red"><b>供应管理</b></font></legend>
										<table align="center">
											<tr>
												<td><select id="fromSupplySelect" ></select></td>
												<td>
													<input type="button" id="fromSupplyButton" value=">>" /><br>
													<input type="button" id="toSupplyButton" value="<<" /><br>
												</td>
												<td><select id="toSupplySelect" ></select></td>
											</tr>
										</table>
								</fieldset>
							</td>

							<td >
								<fieldset>
									<legend><font color="red"><b>维修管理</b></font></legend>
										<table align="center">
											<tr>
												<td><select id="fromMaintainSelect" ></select></td>
												<td>
													<input type="button" id="fromMaintainButton" value=">>" /><br>
													<input type="button" id="toMaintainButton" value="<<" /><br>
												</td>
												<td><select id="toMaintainSelect" ></select></td>
											</tr>
										</table>
								</fieldset>
							</td>
						</tr>
						<tr></tr>
						<tr></tr>
					</table>

  

step2:MultiSelect初始化(以配置管理为例),其中下拉框的数据是从服务器端请求获得

	    	//配置管理下拉框
	    	var fromConfig,multiFromConfig;
	    	var storeFromConfig;
			request.get("roleInputGetJsonAction.action?mode=query&roleInput.fromSelect=config",{handleAs : "json"})//向服务器查询对应于WBS的设备名
				   .then(function(data){
					   storeFromConfig=new Memory({ data: data });
			            // 创建配置管理的下拉框
						fromConfig = dom.byId(‘fromConfigSelect‘);
						index=0;
					 	for(var item in storeFromConfig.data){
							var option = Win.doc.createElement(‘option‘);
							option.innerHTML=storeFromConfig.data[index].name;
							option.value=storeFromConfig.data[index].id;
							index++;
							fromConfig.appendChild(option);
						}
						multiFromConfig = new MultiSelect({ name: ‘multiFromConfig‘,
															size:4,
															style: "width: 180px;",}, fromConfig);
						multiFromConfig.startup();

				   });

			var toConfig,multiToConfig;
	    	var storeToConfig;
	    	storeToConfig=new Memory({ });
			toConfig = dom.byId(‘toConfigSelect‘);
			multiToConfig = new MultiSelect({ name: ‘multiToConfig‘,
												size:4,
												style: "width: 180px;",}, toConfig);
			multiToConfig.startup();

  step3 : 按钮事件的处理程序

 //删除Select所有子节点的函数,多个按钮都会用到
            function removeAllChildren(multiSelectDomNode){
            	while (multiSelectDomNode.firstChild) {
						 var node=multiSelectDomNode.firstChild;
						 multiSelectDomNode.removeChild(node);
					     }
   		 	}

   		 	//FromTo.从一个下拉框中选择数据移动到另一个下拉框
   		 	function removeAndAddSelect(from,to,fromMulti,toMulti,fromMemory,toMemory){
   		 	 	index=0;
                var fromItems=fromMulti.value;//获取鼠标选中的节点(可以是多个节点,以数组的形式)

                for(var fi in fromItems){
              	var id=fromItems[index];
              	var item=fromMemory.get(id);
              	fromMemory.remove(id);
              	toMemory.add(item);
              	index++;
                }           		                          

                index=0;
         	  	for(var item in fromMemory.data){
					var option = Win.doc.createElement(‘option‘);
					option.innerHTML=fromMemory.data[index].name;
					option.value=fromMemory.data[index].id;
					from.appendChild(option);
					index++;
				  }

         		  index=0;
			 	  for(var item in toMemory.data){
					var option = Win.doc.createElement(‘option‘);
					option.innerHTML=toMemory.data[index].name;
					option.value=toMemory.data[index].id;
					to.appendChild(option);
					index++;
				  }

			 	  removeAllChildren(fromMulti.domNode);
			 	  fromMulti._fillContent(from);
			      removeAllChildren(toMulti.domNode);
			      toMulti._fillContent(to);  	  

   		 	}

            //fromConfigButton等按钮的事件处理程序
            var fromConfigButton=dom.byId("fromConfigButton");
           	on(fromConfigButton, "click", function(evt){
           									removeAndAddSelect(fromConfig,toConfig,multiFromConfig,multiToConfig,storeFromConfig,storeToConfig);
          	 							  });
           	var toConfigButton=dom.byId("toConfigButton");
           	on(toConfigButton, "click", function(evt){
           									removeAndAddSelect(toConfig,fromConfig,multiToConfig,multiFromConfig,storeToConfig,storeFromConfig);
          	 							  });

  由于MultiSelect无法直接和store关联,所以必须要写DOM的JS代码。

时间: 2024-10-18 16:38:47

dojo:如何用MultiSelect实现类似ListBox风格的FromTo功能的相关文章

dojo:如何显示ListBox风格的选择框

常见的选择框控件:Selelct.FilteringSelect和ComboBox都是下拉框风格,而不是ListBox风格. dojo还提供了一个dijit.form.MultiSelect控件可以解决问题并支持多选:http://dojotoolkit.org/reference-guide/1.10/dijit/form/MultiSelect.html 需要注意的是该空间不支持store这些,需要动态在JS代码中条件<OPTION>标签. 示例代码(在官网上的代码做了改动) <!D

类似web风格的 Winform 分页控件

背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下,发现路过秋天在多年前写了个分页控件,Winform 通用分页控件实战篇(提供源码下载).站在大神的肩膀上就是快,一会就改好了. 效果图 功能比较齐全,不过样式上,楼主十分喜欢easyUI或ext的列表分页风格.于是换了几个按钮,添加了图标,看看现在的效果. 控件源码在正文最下方. 使用简介 就那么一

请教如何用 peewee 实现类似 django ORM 的这种查询效果。

本人新入坑的小白,如有不对的地方请包涵~~~! 在 django 中代码如下:模型定义: class Friends(models.Model): first_id = models.IntegerField() second_id = models.IntegerField() class Meta: unique_together=('first_id', 'second_id',) 查询语句如下: friend_list_info = [] friend_list1 = Friends.o

【Android】类似QQ风格的popupwindow弹窗效果

[Android]类似QQ风格的popupwindow弹窗效果 该源码主要是实现类似QQ风格的popupwindow弹出窗效果,出现时有遮挡图层,消失时无遮挡图层. 下载地址:http://www.devstore.cn/code/info/273.html

[EXCEL]实现类似Switch case的函数功能

[EXCEL]实现类似Switch case的函数功能 如果你就10种商品的话还好说,再多就不划算了. 假设你"商品1"的价格是"价格1", 那你就在B1里入 =vlookup(A1,{"商品1","价格1";"商品2","价格2";"商品3","价格3";..."商品10","价格10"},2,0) 注意:

js 实现类似php函数number_format的功能

今天同事在做一个功能的时候需要使用js来实现类似php函数number_format的功能,最后就有了下面的方法,可以实现了: /** * number_format * @param number 传进来的数, * @param bit 保留的小数位,默认保留两位小数, * @param sign 为整数位间隔符号,默认为空格 * @param gapnum 为整数位每几位间隔,默认为3位一隔 * @type arguments的作用:arguments[0] == number(之一) */

python 实现类似tweproxy 和codes的功能的redis代理功能

手动编写redis代理软件脚本  实现类似tweproxy  和codes的功能 已经实现内容如下: 起1个代理ip和端口  redisl客户端连接代理  然后脚本通过一致性hash分发key到后端的redis 脚本如下 import SocketServer,sys from threading import Thread import socket from hash_ring import HashRing redis_servers = ['127.0.0.1:6480',       

HTML5实现类似刮刮卡的功能

HTML5实现类似刮刮卡的功能 有这样一个功能,当我们使用微信公众号,发送图片时......此处省略300字! 注意要点设置: 1.设置用户缩放:user-scalable=no|yes <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" /> 2.禁止拖动: docu

如何用Elasticsearch实现类似SQL中的IN查询实例

我想实现类似如下sql语句的效果: select * from table1 where rw_id in ('7a482589-e52e-0887-4dd5-5821aab77eea','c68ace46-1c07-fccf-1cb6-57d4e77e40a2','3c9263d2-c44b-a9fd-155e-57aaf783ed58','69b087df-eb62-3e70-2cc0-582ec84a561b') 相应的ES查询应该写为: $v 即为 rw_id的集合,GET /_sear