cocobear9  
一枚普通的zisuer(lll¬ω¬),努力每天多学一点点

这两天在做前端渲染后的Table后加上上传按钮的时候,遇到了不少坑,由于不是专业前端的还是记录一下自己遇到的问题

 

 实现效果其实不难 主要还是官网的文档没研究清楚

比如:

我们先看看this里面的东西

 

 嗨,原来我们的item里面果然就是当前被选中的元素。

 

 

 

 

 

 

只要在upload.render的done里面先获取当前触发的上传元素,就能动态获取对应的DOM元素绑定elem了

下面直接上代码:对应的删除功能不用动态获取,直接使用layevent操作即可

<body class="layui-layout-body">
<%--引入js文件--%>
<script src="${pageContext.request.contextPath}/layui/layui.js"></script>
    <div class="layui-layout layui-layout-admin">

        <div class="layui-body">
            <!-- 内容主体区域 -->
            <fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
                         <legend>上传视频</legend>
            </fieldset>

            <table id="table" lay-filter="table">

            </table>


        </div>

    </div>

<script>
    layui.use(['element','table','layer','jquery','form','laydate','upload'],function () {
        var element = layui.element
            , table = layui.table
            , layer = layui.layer
            , $ = layui.jquery
            , form = layui.form
            , laydate = layui.laydate
            , upload = layui.upload;



        //方法渲染
        table.render({
            elem: '#table' //指定原始表格元素选择器(推荐id选择器)
            ,height: 315 //容器高度
            ,url:'/Manager/video/detailList/2'
            ,page:{
                layout: [ 'count', 'prev', 'page', 'next', 'skip','limit']
                ,limit:5
            }
            , cols:  [[ //标题栏
                 {field: 'id', title: 'ID',hide:true}
                ,{field: 'episode', title: '第几集', width: 80}
                ,{field: 'title', title: '标题'}
                ,{field: 'fileName', title: '状态',minWidth:60,templet:function (d) {
                        return d.fileName== null ?'未上传':'已上传';
                    }}
                ,{field: 'publishDate', title: '上传时间',sort: true}
                ,{fixed: 'right', title: '进度',width:320,align: 'center'
                    ,templet:function (d) { //d可以取到改行的所有数据
                        return '<div class="layui-progress" lay-showPercent="yes" lay-filter="'+ d.id+'">\n' +
                            '                    <div class="layui-progress-bar layui-bg-red" lay-percent="0%"></div>\n' +
                            '                </div>' ;
                    }}
                ,{field: 'fileName',fixed: 'right',title:'操作',align: 'center'
                    ,templet:function (d) { //这里的参数d是templete的固定用法,可以取到该行的所有数据
                        if(d.fileName ==null){ //未上传
                            //class里的upload_btn是用来标志上传按钮的,没有定义实际的css样式
                            return '<button class="layui-btn layui-btn-sm upload_btn" value="'+d.id+'" >上传</button>';
                        }else{ //已上传||被替换
                            return '<button class="layui-btn layui-btn-xs replace_btn" value="'+d.id+'">替换</button>' +
                                '<button class="layui-btn layui-btn-danger layui-btn-xs delete_btn" lay-event="delete" value="'+d.id+'">删除</button>';
                            //删除按钮不需要渲染上传,只是一个动作按钮,可以通过lay-event进行行事件监听
                        }
                    }}
            ]]
            //done - 数据渲染完的回调,无论是异步请求数据,还是直接赋值数据,都会触发该回调。你可以利用该回调做一些表格以外元素的渲染。
            ,done: function(res, curr, count){ //表格加载完成后,对上传按钮进行渲染

                //渲染当前页面的所有upload组件
                upload.render({
                    //elem 指向容器选择器,如:elem: '#id'。也可以是DOM对象    string/object
                    elem:'.upload_btn'//搜索所有tableViewElem中的后代 upload_btn
                    //<button class="layui-btn layui-btn-sm upload_btn" value="25">上传</button>
                    //<button class="layui-btn layui-btn-sm upload_btn" value="26">上传</button>
                    ,url:'/Manager/video/detail/upload'
                    ,accept: 'video'
                    ,before:function (obj) {//obj包含信息,跟choose回调完全一致。在传值之前先获取id
                        console.log("this"+this);
                        var tableElem = this.item;
                        //获取当前触发上传的元素,一般用于 elem 绑定 class 的情况,注意:此乃 layui 2.1.0 新增
                        //也就是-->this:<button class="layui-btn layui-btn-sm upload_btn" value="25">上传</button>

                        //console.log("this.item:"+tableElem);
                        uploadParam  = tableElem.attr('value');
                        console.log("ableElem.attr('value'):"+uploadParam);//25
                        layer.load();//上传loading
                    }
                    ,data:{
                        id:function () { //data中写值的时候,要用动态获取的方式,即写个function的方式,不然直接写获取不到相应的值。
                            return uploadParam ; //得到上面的对应的ID值
                        }
                    }
                    ,progress: function(n, elem) {
                        console.log(n);
                        var percent = n + '%' //获取进度百分比
                        element.progress(uploadParam, percent); //可配合 layui 进度条元素使用

                        //以下系 layui 2.5.6 新增
                        //alert(elem)
                        //console.log(elem); //得到当前触发的元素 DOM 对象。可通过该元素定义的属性值匹配到对应的进度条。
                    }
                    ,done: function (res) {
                        if(res.code == 1){
                            layer.closeAll('loading');//关闭loading
                            layer.msg('上传成功');
                        }else if(res.code == 0 ){
                            layer.closeAll('loading'); //关闭loading
                            layer.msg("添加视频失败!");
                        }

                    }

                })


            }

        });




        /*
        * 监听table中工具条 上传, 编辑 ,删除等按钮的点击事件
        */
        table.on('tool(table)', function(obj){ //注:tool 是工具条事件名,table 是 table 原始容器的属性 lay-filter="对应的值"
            var data = obj.data; //获得当前行数据
            var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
            var tr = obj.tr; //获得当前行 tr 的 DOM 对象(如果有的话)
            //alert(data.id);
            if(layEvent === 'upload'){ //上传
                //uploadVideo(data.id);
                //do somehing
            } else if(layEvent === 'delete'){ //删除
                layer.confirm('真的删除行么', function(index){
                    obj.del(); //删除对应行(tr)的DOM结构,并更新缓存
                    layer.close(index);
                    //向服务端发送删除指令
                });
            } else if(layEvent === 'update'){ //编辑
                //do something

                //同步更新缓存对应的值
                obj.update({
                    username: '123'
                    ,title: 'xxx'
                });
            } else if(layEvent === 'LAYTABLE_TIPS'){
                layer.alert('Hi,头部工具栏扩展的右侧图标。');
            }
        });




        





    });


</script>
</body>

 

posted on 2020-11-23 19:20  cocobear9  阅读(2292)  评论(0编辑  收藏  举报