1. 程式人生 > >高階查詢元件下拉框聯動(三)

高階查詢元件下拉框聯動(三)

實現下拉框聯動例子.

1.首先在ul中定義省份和城市查詢條件。

<ul id="dynamicCondition" style="display:none;">
	<li field="DynamicCondition.province" title="省份" ops="equal" edit="selectProvince" templet="#dict-province"  layVerify="" allowDel="false"></li>
	<li field="DynamicCondition.city" title="城市" ops="equal" edit="selectCity" templet="#dict-city" layVerify="" allowDel="false"></li>
</ul>

因為是級聯操作,條件直接有關聯關係,所以設定屬性allowDel=“false”。不然要考慮條件選擇時缺少省份或者城市時太複雜了。
然後因為是下拉框選擇,一般操作就是equal,所以設定ops=“equal” 儘量簡化,除去不必要的邏輯。
元件自帶的編輯器只有text,select,date。上面的selectProvince,selectCity是我們要擴充套件的編輯器。

2.擴充套件編輯器。

var editorProvince = dynamicCondition.createEditor("selectProvince");
  $.extend( editorProvince ,{
		createElement:function(item){
			var selectHtml;
			if($(item.templet).is("select")){
				selectHtml = $(item.templet).prop("outerHTML");
			}else{
				selectHtml = $(item.templet).html();
			}
			return $(selectHtml);
		}
	  ,getRequestText:function(ele){
		    return  ele.find("option:selected").text();
		}
  })
  
  var editorCity = dynamicCondition.createEditor("selectCity");
  $.extend( editorCity ,{
	  	createElement:function(item){
			var selJq = $("<select>");
			selJq.append("<option value=''></option>");
			return selJq;
		}
		,getRequestText:function(ele){
			return  ele.find("option:selected").text();
		}
  })

3.建立查詢元件例項。重點是在afterOpen中實現下拉框聯動繫結初始化。

var dc = dynamicCondition.create({
  		//通過容器選擇器傳入,也可以$("#dynamicCondition"),或者document.getElementById("dynamicCondition")
  		elem:"#dynamicCondition" 
	  	,tableId:"listTableId" 
		,conditionTextId:"#msg"
		,afterOpen:function(_dc){
			  //下拉框聯動
			  form.on('select(province)', function(data){
				  var params={province:data.value};
				  $.post("/#(appName)/demo/dynamicCondition/getCityList",params,function(data){
				        if(data.code == 0){
				        	var eleJq = _dc.getRowDivs("DynamicCondition.city")[0].eleJq;
				        	eleJq.html("<option value=''></option>");
				      	    $.each(data.otherData.cityList, function(key, val) {
				      	                  var option1 = $("<option>").val(val.value).text(val.label);
				      	                   eleJq.append(option1);
				      	    }); 
				      	  	form.render('select');
				        }
				    });
			  })
			  //如果省份有值,則需要初始化城市下拉框
			  var provinceVal =  _dc.getVal("DynamicCondition.province");
			  if(provinceVal){
				  var params={province:provinceVal};
				  $.post("/#(appName)/demo/dynamicCondition/getCityList",params,function(data){
				        if(data.code == 0){
				        	var eleJq = _dc.getRowDivs("DynamicCondition.city")[0].eleJq;
				        	eleJq.html("<option value=''></option>");
				      	    $.each(data.otherData.cityList, function(key, val) {
				      	                  var option1 = $("<option>").val(val.value).text(val.label);
				      	                   eleJq.append(option1);
				      	    }); 
				      	  	eleJq.val(eleJq.attr("oldVal"));
				      	  	form.render('select');
				        }
				  });
			  }
			  
  		}
	});

程式碼中需要注意的地方:
var provinceVal = _dc.getVal(“DynamicCondition.province”);
通過上面程式碼可以獲取彈出的條件查詢視窗中省份的值provinceVal。

var eleJq = _dc.getRowDivs(“DynamicCondition.city”)[0].eleJq;
通過上面程式碼可以獲取selectCity建立的ele物件。每行的div物件有快取編輯器建立的ele物件。
如果操作符是between,則會快取eleLeftJq和eleRightJq。

eleJq.val(eleJq.attr(“oldVal”));
eleJq.attr(“oldVal”)這個能獲取到值是因為預設的fillElement函式將值寫入了oldVal屬性。因為之前“城市”下拉框資料還沒有載入進去,所以$(ele).val(val.value);設定無效。當“城市”下拉框資料載入完成時想獲取原來的資料就可以通過oldVal屬性來獲取了。

/***
* 初始值填充DOM。這個方法只會在使用者點選查詢按鈕,彈出視窗渲染時,給對應查詢條件設定之前儲存的值。
* ele createElement 生成的物件
* val 值 格式{value:"",text:""}
*/
fillElement:function(ele, val){
	$(ele).val(val.value);
	$(ele).attr("oldVal",val.value);
}

4.設定初始條件。因為設定了 allowDel=“false” ,那麼就必須設定初始條件,否則這個條件就看不到了。

dc.setCondition([ ["DynamicCondition.province",null,""],["DynamicCondition.city",null,""]  ]);

到這裡下拉框聯動就實現了。
相關連結:
外掛原始碼:去碼雲下載 或者 去layui官網下載
體驗地址1:動態新增條件查詢Demo
體驗地址2:帶後臺的查詢demo
基於layui的動態新增條件查詢ui外掛
高階查詢元件dynamicCondition升級為v2.0.0版本(一)
高階查詢元件dynamicCondition升級為v2.0.0版本(二)