最近使用了layui的前端框架,也在慢慢适应中,好多功能都已经封装得很实用,遇到不会的功能,看看官网的demo的文档,都还是可以解决的,毕竟咱们的模仿能力还是可以的。
记录一下昨天遇到的一个问题,就是我想在表格的头部工具栏,增加一个文件上传的接口,用于数据的批量导入,就简单的写了一个按钮,使用upload组件实现了功能,但是奇怪的事情发生了,第一次上传成功之后,页面不刷新,再次点击第二次的话,是无法上传文件,向后台发出请求的,最后排查的原因是,按钮上面的事件没有被渲染,导致上传组件无法与指定的按钮进行绑定。
<script type="text/html" id="headToolbarTpl">
<input type="button" class="layui-btn layui-btn-sm" id="import" value="导入明细"/>
<input type="button" class="layui-btn layui-btn-sm" lay-event="download" style="margin-left: 10px" value="下载模板"/>
</script>
//指定允许上传的文件类型
upload.render({
elem: '#import'
, url: BASE_WEB + 'enterprisepoints/enterprisePointsBatch/importExcel' //改成您自己的上传接口
, accept: 'file' //普通文件
, acceptMime: '.xls,.xlsx'
, done: function (res) {
if (res.code == 400) {
table.reload(tableId);
layer.msg(res.msg, {
time: 4000});
else {
table.reload(tableId);
bindTableToolbarFunction();
bnyKit.errorMsg(res.msg);
}
// Layui的table在reload之后使用ID绑定的按钮失效,需要重新绑定
bindTableToolbarFunction();
}
});
问题是在进行操作后,没有执行渲染事件,那么好,我在执行的每次动作之后,都重新执行一下渲染就可以。
// Layui的table在reload之后使用ID绑定的按钮失效,需要重新绑定
function bindTableToolbarFunction() {
// 绑定新增用户事件
upload.render({
elem: '#import'
, url: BASE_WEB + 'enterprisepoints/enterprisePointsBatch/importExcel' //改成您自己的上传接口
, accept: 'file' //普通文件
, acceptMime: '.xls,.xlsx'
, done: function (res) {
if (res.code == 400) {
table.reload(tableId);
layer.msg(res.msg, {
time: 4000});
} else {
table.reload(tableId);
layer.msg('上传成功');
layer.msg(res.data, {
time: 5000, //20s后自动关闭
btn: ['关闭']
});
}
}
});
}
if (layEvent === 'details') {
layer.open({
type: 2
, title: '明细详情'
, content: BASE_WEB + 'enterprisepoints/enterprisePointsBatch/details?batchId=' + data.id
, maxmin: true
, area: area // 宽高
, btn: ['关闭']
, yes: function (index, layero) {
layer.closeAll();
}
});
bindTableToolbarFunction();
}
我们可以沿用layui提供了头部工具栏的功能,只是我需要去避免绑定按钮的失效渲染即可,
表格的工具栏模板如上,我猜想,每次在进行工具栏渲染的时候,一定是按照toolbarDemo这个id进行的,我的控件id,正式因为渲染才失效的,那么我是不是可以把按钮拿出来,然后进行上传组件的绑定呢,除此之外,lay-event这个控件还是正常使用,只是在lay-event事件处理的时候,再出发我的上传按钮的点击动作。
<!--头部工具栏模板-->
<button type="button" class="layui-btn layui-btn-sm" id="importFile" value="导入明细" style="display: none"/>
<script type="text/html" id="headToolbarTpl">
<input type="button" class="layui-btn layui-btn-sm" lay-event="import" style="margin-left: 10px" value="导入明细"/>
<input type="button" class="layui-btn layui-btn-sm" lay-event="download" style="margin-left: 10px"
value="下载模板"/>
</script>
注:由于我在模板中已经加了导入明细的按钮操作,所以我将自己声明的按钮隐藏掉,防止页面重复出现
//指定允许上传的文件类型
upload.render({
elem: '#importFile'
, url: BASE_WEB + 'enterprisepoints/enterprisePointsBatch/importExcel' //改成您自己的上传接口
, accept: 'file' //普通文件
, acceptMime: '.xls,.xlsx'
, done: function (res) {
if (res.code == 400) {
table.reload(tableId);
layer.msg(res.msg, {
time: 4000});
} else if (res.code == 200) {
table.reload(tableId);
//bindTableToolbarFunction();
bnyKit.sucessMsg(res.msg)
} else {
table.reload(tableId);
//bindTableToolbarFunction();
bnyKit.errorMsg(res.msg);
}
// Layui的table在reload之后使用ID绑定的按钮失效,需要重新绑定
//bindTableToolbarFunction();
}
});
case 'import':
$("#importFile").click();
break;
网上确实有好多人遇到这个问题,但是试了好多个方案,都不是很理想,其中还有使用table.render中的done函数的,但是也还是不行,遂自己总结一下,避免后面踩坑。