Layui 列表页面关闭子窗口刷新列表数据

问题:

业务反馈一个问题:比如在某一个数据列表的第10页,点击修改按钮,对数据进行修改,点击提交后,页面直接整个刷新,列表也直接跳回了第1页。问:能不能保持列表的搜索条件,不全局刷新?

排查

经查看,是在子窗口提交接口的处理逻辑里面发现了如下代码:

success: function (data) {
      if (data.code === 'success') {
           var index = parent.layer.getFrameIndex(window.name);//获取子窗口索引
           parent.layer.close(index);//关闭当前页
           parent.location.reload();//父窗口刷新
       } else {
           layer.msg("确认失败:" + data.msg);
       }
   }

那么父页面整个刷新的逻辑就找到了。

问题解决

经查,发现了实现业务的需求有两种方式:

方法一:

将逻辑写在子页面这里,将上述代码修改为

success: function (data) {
      if (data.code === 'success') {
           var index = parent.layer.getFrameIndex(window.name);//获取子窗口索引
           parent.layer.close(index);//关闭当前页
           此处的这个parentId为父页面数据列表处的那个table的id,且注意父页面一定要定义了table
           parent.layui.table.reload("parentId");
       } else {
           layer.msg("确认失败:" + data.msg);
       }
   }

将父页面整体刷新的代码替换为:

即可解决问题。

方法二:

由于子页面的打开方式是通过layer.open的方式打开的,如下所示:

layer.open({
       type: 2,
       title: "修改数据",
       area: ['700px', '500px'],
       content: "url"
   });

经查看,Layui文档,发现这里面还有一个end参数,即关闭了弹窗就会执行的逻辑:
所以在layer.open里面写好end方法,如下:

layer.open({
       type: 2,
       title: "修改数据",
       area: ['700px', '500px'],
       content: "url",
       end: function (){
          layui.table.reload("tableId")
      }
   });

同样可以解决问题。

插曲

在一个列表使用上述任一方式获得成功后,又在另一个页面尝试使用了上述的方法一,但是页面却报错了:
Uncaught TypeError: Cannot read properties of undefined (reading ‘reload’)
提示相关的table没有定义,但是对比了两个子页面的JS代码,几乎没有差异,几经对比发现,此处报错的这个父页面的代码,使用的是

parent.layer.open

而它本身就是父页面了,类似于最底层了,不用再使用parent,于是将此处的代码直接修改成

layer.open

修改完成后,再进行测试,发现问题解决。

最后

经过对比,由于上述方式二需要,在子页面填写父页面相关数据列表的id,为了避免出错,还是推荐在父页面,使用layer.open的时候直接写好end方法。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
layui中,父窗口可以通过窗口的iframe元素来获取窗口的json数据。你可以使用以下方法: 1. 在父窗口中,使用layui的layer.open()方法打开窗口,并将窗口的URL指定为一个页面,该页面返回要传递给父窗口的json数据。 2. 在窗口页面中,通过父窗口的window对象的layer.getFrameIndex()方法获取当前窗口的索引。 3. 使用layui的layer.getChildFrame()方法获取窗口的iframe元素。 4. 使用iframe元素的contentWindow属性获取窗口的window对象。 5. 在父窗口中,通过窗口的window对象来获取窗口中的json数据。 下面是一个示例代码: 在父窗口中: ```javascript // 打开窗口 layer.open({ type: 2, title: '窗口', content: 'child.html', area: ['500px', '300px'], success: function(layero, index){ // 获取窗口的索引 var childIndex = layer.getFrameIndex(layero.find('iframe')[0]); // 获取窗口的iframe元素 var iframe = layer.getChildFrame('body', childIndex); // 获取窗口的window对象 var childWindow = iframe[0].contentWindow; // 在父窗口中获取窗口的json数据 var jsonData = childWindow.getJsonData(); console.log(jsonData); } }); ``` 在窗口的child.html页面中: ```javascript // 窗口中的代码 function getJsonData() { // 返回要传递给父窗口的json数据 return { name: 'John', age: 25, city: 'New York' }; } ``` 请注意,这只是一个简单的示例,你可以根据自己的需求进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值