<p>laytpl条件语法必须用{{# if() { }}...{{# } }},三元运算应改用||或额外判断"null"字符串,复杂逻辑需抽为模板函数,toolbar模板ID须唯一且确保数据传入和事件监听时机正确。</p>
laytpl 里不能直接写 if-else 块,得用 {{# if(...) { }} ... {{# } }}
很多人一上来就写 {{if(d.sex === '1'){}},结果模板完全不渲染——因为 laytpl 的条件语法必须带 # 号且成对闭合。正确写法是:{{# if(d.sex === '1'){ }} 开头,{{# } }} 结尾,中间放 html 内容。漏掉 #、多写空格、忘记闭合,都会导致整个模板解析失败,页面空白或报错 uncaught typeerror: cannot read property 'replace' of undefined。
表格字段为空或 null 时显示默认值,别硬写三元运算符嵌套
像 {{r.SHUJI_NAME==undefined?'':r.SHUJI_NAME}} 这种写法在字段为 null 时照样输出 "null",因为 == undefined 不等于 == null,更不覆盖 "" 或 0。实际应统一用逻辑或:{{ r.SHUJI_NAME || '' }}。但注意:如果后端返回的是字符串 "null"(JSON 序列化错误),那还得额外判断:{{ (r.SHUJI_NAME !== 'null' && r.SHUJI_NAME != null) ? r.SHUJI_NAME : '' }}。
需要分支多、逻辑深时,必须抽成模板函数
比如组织类型映射、状态颜色标记、权限按钮显隐等,硬塞在模板里会让 <script type="text/html"></script> 区域难以维护,也容易触发 laytpl 解析上限。正确做法是在模板末尾定义函数:
{{# function showStatusColor(status){
var cls = 'layui-btn-xs';
switch(status){
case '0': return cls + ' layui-btn-disabled';
case '1': return cls + ' layui-btn-normal';
case '2': return cls + ' layui-btn-warm';
default: return cls + ' layui-btn-danger';
}
}}}然后在单元格中调用:<span class="{{ showStatusColor(r.status) }}">{{ r.statusName }}</span>。注意两点:函数名必须在 {{# }} 块内定义;调用时不能加 #,即写 {{ showStatusColor(...) }},不是 {{# showStatusColor(...) }}。
表格行内工具栏(toolbar)里用 laytpl,要防重复渲染和事件丢失
表格的 toolbar 列常配合 lay-template 使用,例如:<script type="text/html" id="barDemo">{{# if(d.isEditable){ }}<a lay-event="edit">编辑</a>{{# } }}</script>。这里容易踩三个坑:
- 模板 ID 必须全局唯一,否则多个表格共用同一
id="barDemo"会导致只渲染第一个 -
d是当前行数据,但若表格启用了page: true,分页后d.isEditable可能未传入,需检查后端是否把该字段包含在每页响应数据中 - 模板渲染完,
lay-event绑定依赖table.on('tool(filter)', ...),但这个监听必须在table.render()之后执行,否则点击无反应
复杂判断往往不在“怎么写”,而在“数据有没有、字段对不对、上下文是不是当前行”——laytpl 不报错,但数据缺失时它就默默输出空字符串,这种静默失败最难排查。


















