直接用form.val()可一次性回显大部分字段,但select、radio、checkbox需额外调用form.render()(如form.render('select'))才能生效;必须确保表单有lay-filter属性、模块已加载、dom就绪,且跨iframe时需在子页面内执行渲染。
直接用 form.val() 就能完成大部分字段的回显,但下拉框、单选、复选框必须额外调用 form.render(),否则只赋值不生效。
用 form.val() 一次性填充整个表单
这是最干净、最不易出错的方式,前提是弹出层页面已初始化 layui.form,且表单有 lay-filter 属性。
- 父页面在
layer.open的success回调中获取子页面iframe的window对象,再调用其layui.form.val() -
form.val()第一个参数是表单的lay-filter值(字符串),第二个参数是键值对对象,key 必须和表单元素的name完全一致 - 该方法自动处理
input、textarea、radio、checkbox,但select仍需手动触发渲染
示例(父页面):
success: function(layero, index) {
var iframeWin = layero.find('iframe')[0].contentWindow;
// data 是你从表格行工具事件拿到的对象
iframeWin.layui.form.val('editForm', data);
}
动态下拉框(select)回显必须加 form.render('select')
即使你用 form.val() 设置了 select 的 name 值,Layui 的美化下拉框也不会自动高亮对应选项——因为 DOM 的 option 被隐藏了,渲染层是独立的。
- 必须在
form.val()后,立刻调用form.render('select') - 如果下拉框数据是异步加载的(比如通过 AJAX 获取城市列表),要等数据加载完成、
selectDOM 更新完毕后再执行form.render('select') - 常见错误:在父页面调用
layui.form.render('select')——这没用,必须在子页面 iframe 内部调用
示例(子页面):
// 子页面 JS 中确保有
var form = layui.form;
// 若 select 数据已存在 DOM 中(静态或同步加载)
form.val('editForm', data);
form.render('select');
// 若 select 数据异步加载,需在回调里 render
$.get('/api/cities', function(res) {
var $sel = $('select[name=city]');
res.data.forEach(function(item) {
$sel.append('<option value="' + item.id + '">' + item.name + '</option>');
});
form.val('editForm', data);
form.render('select'); // 关键:这里才 render
});
单选/复选框(radio/checkbox)回显失败的典型原因
这类控件回显失败,90% 是因为 value 类型不匹配或 DOM 未就绪。
-
radio的value必须是字符串,若后端传的是数字(如data.sex === 1),而 HTML 中写的是value="1",那没问题;但如果写成value=1(无引号),浏览器可能解析为 number,导致匹配失败 - 不要用
$('input[name=sex][value=' + data.sex + ']').prop('checked', true)手动设属性——它绕过了 Layui 渲染逻辑,UI 不会更新 - 务必保证
form.val()调用时,所有radio/checkbox元素已在 DOM 中,否则会被忽略
iframe 弹窗中子页面未定义 layui.form 导致回显无效
这是最容易被忽略的硬性前提:子页面必须显式声明 var form = layui.form,否则 form.val() 和 form.render() 都会报 undefined 错误。
- 子页面
<script></script>中不能只写layui.use('form', callback)就完事,必须在callback内把form挂到作用域顶层(如window.form = layui.form或直接var form = layui.form) - 父页面通过
iframeWin.layui.form访问时,依赖的是子页面已执行并暴露了该模块 - 如果子页面用了
layui.use(['form', 'layer'], function(){...}),但没把form提出来,父页面就会拿不到
子页面正确写法(关键两行):
layui.use(['form', 'layer'], function(){
var form = layui.form; // ← 必须声明
var layer = layui.layer;
// 其他代码...
});
复杂点在于:回显不是一次赋值就结束的事,而是「数据到位 → 表单模块识别 → 渲染层更新」三步缺一不可。最容易卡在第三步——尤其是动态 select 和跨 iframe 作用域访问时,稍有遗漏 UI 就不动。











