select異步加載和自定義定時觸發器

用戶表單頁面有十幾個select標籤,每一個都要向後臺字典表請求數據,那麼問題來了,在編輯的時候要將select反顯應該怎麼做?我們的項目是通過js請求反顯的。如果要讓select反顯,那麼只能先等待select加載以後才能反顯。這樣就只能將select的ajax請求設成同步,結果是加載速度極慢。所以要實現異步才行。

這時有兩個思路,第一個思路,給頁面的select元素設置load屬性爲false,當ajax請求成功執行後再設爲true。將相應的用戶編輯信息暫時放在緩存中,開個定時器任務,監測頁面select元素的load屬性,爲true就將select相應的值反顯。

第二個思路,先請求用戶編輯內容,當返回編輯數據後,在請求返回後,再發起select的ajax請求,直接ajax返回後,直接將選中的option標籤加上selected屬性。

function createBindDrop(codeclass,id,select){
	var sb = [];
	sb.push('<option value="">==請選擇==</option>');
	$.ajax({
		url:"請求路徑",
		type:"get",
		dataType:"json",
		data:{
			codeclass:codeclass,
			pageFlag:1,
			rows:300
		},
		success:function(result){
			if(result.statusCode == 200){
				var list = result.data.rows;
				$.each(list,function(i,n){
					if(n.fullName == select)	
						sb.push('<option selected value="'+n.fullName+'">'+n.fullName+'</option>');
					else
						sb.push('<option value="'+n.fullName+'">'+n.fullName+'</option>');
				});
				$("#"+id).html(sb.join(""));
				});
			}else{
				commPageAjaxDone(result);
			}
		}
	});
}

第二個思路簡單多了,所以我選擇第二個方案。本來這樣就大功告成了,但是我發現頁面中還有一些動態生成的表單。這些表單也會請求字典表生成select。跟靜態選項比多了一個麻煩,那就是我執行createBindDrop方法時,動態表單元素還沒有生成,所以我得先阻塞方法,等待頁面元素生成再調用html方法

function createBindDrop(codeclass,id,select){
	var sb = [];
	sb.push('<option value="">==請選擇==</option>');
	$.ajax({
		url:"請求路徑",
		type:"get",
		dataType:"json",
		data:{
			codeclass:codeclass,
			pageFlag:1,
			rows:300
		},
		success:function(result){
			if(result.statusCode == 200){
				var list = result.data.rows;
				$.each(list,function(i,n){
					if(n.fullName == select)	
						sb.push('<option selected value="'+n.fullName+'">'+n.fullName+'</option>');
					else
						sb.push('<option value="'+n.fullName+'">'+n.fullName+'</option>');
				});
				myTime(function(){
					if(!!$("#"+id)[0]){//判斷頁面元素是否存在
						$("#"+id).html(sb.join(""));
					}else{
						return true;
					}
				});
			}else{
				commPageAjaxDone(result);
			}
		}
	});
}
function myTime(func,timeout){
	if(!timeout)
		timeout = 500;
	if(!func())//
		return;
	setTimeout(myTime(func,timeout),timeout);
}

這裏特別提一下爲什麼用!func()而不是!!func(),因爲當方法不返回值時,!func()的值時true,因爲我之前不小心沒有寫返回值,然後如果用!!func()做判斷條件,定時器就會一直執行下去。所以!func()可以減少風險,就是隻有返回true,定時器纔會執行下去。

以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章