layui 編輯頁面沒有等父頁面值傳入就渲染完了,導致父頁面數據沒有傳入子頁面

使用layui來做後臺管理,遇到一個很奇葩的問題:

在list頁面列出了所有的記錄,然後點擊編輯,彈出一個新頁面來顯示需要修改的字段,然後裏面有幾個checkbox,使用 

body.find("#dwServiceMode1").prop("checked",edit.dwServiceMode==1);

 來選中,在回調success:中使用子頁面的form.render()來渲染,然後就出問題了,有事可以渲染,有時又不能渲染;

 折騰了一天,最終定位來渲染的時序上,只是沒有渲染出來,但是值還是已經傳到子頁面的對應的屬性裏面了;

最終的解決方案:

在子頁面中定義渲染的方法,父頁面成功的回調中調用子頁面的渲染方式,完美解決了這個bug

function edit(edit){
		        var index = layer.open({
		            title : "添加",
		            type : 2,
		            content : "addUI",
		            success : function(layero, index){
		               var iframeWindow = layero.find('iframe')[0].contentWindow;  
		               var body = layui.layer.getChildFrame('body',index);
		                body.find("#dwGameID").html('<option value=""></option>' + gameOption);
	                    body.find("#dwGameRoomID").html('<option value=""></option>' + roomOption);
		                body.find("#gameData").val(JSON.stringify(gameData));
 						if(edit){
		                	body.find("#dwBatchID").val(edit.dwBatchID);
		                    body.find("#dwServiceMode").val(edit.dwServiceMode);
		                    body.find("#dwAndroidCount").val(edit.dwAndroidCount);
		                    body.find("#dwGameID").val(edit.dwGameID).prop('disabled',true);
		                    body.find("#dwGameRoomID").val(edit.dwGameRoomID).prop('disabled',true);
		                    
		                    body.find("#dwGameName").val(edit.dwGameName).prop('disabled',true);
		                    body.find("#dwGameRoom").val(edit.dwGameRoom).prop('disabled',true);
		                    
		                    body.find("#lTakeMinScore").val(edit.lTakeMinScore);
		                    body.find("#lTakeMaxScore").val(edit.lTakeMaxScore);
		                    body.find("#dwEnterMinInterval").val(edit.dwEnterMinInterval);
		                    body.find("#dwEnterMaxInterval").val(edit.dwEnterMaxInterval);
		                    body.find("#dwLeaveMinInterval").val(edit.dwLeaveMinInterval);
		                    body.find("#dwLeaveMaxInterval").val(edit.dwLeaveMaxInterval);
		                    body.find("#dwSwitchMinInnings").val(edit.dwSwitchMinInnings);
		                    body.find("#dwSwitchMaxInnings").val(edit.dwSwitchMaxInnings);
		                    body.find("#AndroidCountMember0").val(edit.AndroidCountMember0);
		                    
		                    body.find("#dwServiceMode1").prop("checked",edit.dwServiceMode==1);
		                    
		                    body.find("#open").attr("checked",edit.open==1);
		                }
		                iframeWindow.reRender();
		            }
		        })
		         layui.layer.full(index);
		        //改變窗口大小時,重置彈窗的寬高,防止超出可視區域(如F12調出debug的操作)
		        $(window).on("resize",function(){
		            layui.layer.full(index);
		        })
		    }

關鍵的代碼

var iframeWindow = layero.find('iframe')[0].contentWindow;  
iframeWindow.reRender();

//edit頁面中定義reRender()方法
function reRender(){
    layui.use('form', function() {
	        var form = layui.form;
	        form.render();
	    });
	} 

2019年5月15日11:28:27====================================================================

新發現一個比較好的解決方案,父頁面直接獲取到子頁面,然後定義一個變量來存整個對象,然後跳轉到子頁面,子頁面使用一個定時器自循環,直到這個對象不爲空,開始在子頁面賦值渲染

 var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe頁的窗口對象,執行
 iframe頁的方法:iframeWin.method()
            iframeWin.fromParentEditData = data.item_;
var timer = setInterval(function () {
            if (fromParentEditData) {
          if (typeof fromParentEditData === 'object') {
            backView();
          }
          clearInterval(timer);
        }
      })
function backView() {
   console.log(fromParentEditData);
//這裏賦值和渲染頁面
}

 

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