用戶表單頁面有十幾個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,定時器纔會執行下去。
以上。