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);
//这里赋值和渲染页面
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值