layuiadmin(iframe)常用問題集錦


 

1. 彈出窗口中傳值給父層表單

    table.on('tool(tableList)', function(obj){
        var selected = obj.data;
        var layEvent = obj.event;
        if(layEvent === 'selected'){
            parent.layui.$('#ptCode').val(selected.ptCode); //此處給父層表單字段ptCode傳值
            parent.layer.close(index);
        }
    });

2.彈窗口中關閉自身

index=parent.layer.getFrameIndex(window.name);  //先獲得父層窗口索引
parent.layer.close(index); //再關閉

3. 實時監控輸入框中文本變化

這個在實時模糊查詢中特別常見,

#keywords為輸入框的id。先獲取輸入框的值,然后執行表格的查詢操作。

$("#keywords").on("input",function(e){
        //獲取input輸入的值
        var keywords = e.delegateTarget.value;
        table.reload('tableList', {where: {keywords: keywords},page:{curr:1}});
});

4. 表單的輸入框后面添加按鈕,並觸發按鈕事件

          <div class="layui-inline">
                   <label class="layui-form-label-sm">商品信息</label>
                   <div class="layui-input-inline-sm">
                   <input type="text" id="ptCode" name="ptCode"  class="layui-input-sm">
                   <i class="layui-icon layui-icon-template-1 layui-btn layui-btn-sm" data-type="popSearchProduct" style="margin-left:-10px;height:28px;"></i>
                   </div>
          </div> 

看看效果,下面商品后面有個按鈕,用來彈出搜索框:

5. 按鈕觸發事件

layui的按鈕觸發事件有幾種,這里介紹一種常用的:

    //根據表單中data-type的值判斷
active={ popSearchProduct: function(){ layer.open({title: '商品搜索', type:2, offset:'50px', area:['620px','510px'], content: ctx + '/product/productSearch' }); } };
//觸發表單中帶layui-btn-sm的按鈕的單擊事件 $(
'.layui-btn-sm').on('click', function(){ var type = $(this).data('type'); active[type] ? active[type].call(this) : ''; });

6. 指定默認日期作為查詢條件

剛開始進入查詢頁面時,默認條件都為空,查詢所有。如何指定默認日期作為開始查詢條件。

   在開始查詢時,添加where條件,填寫默認查詢條件。

        table.render({
              elem: '#lay-tableList'
              ,url: ctx+'/customInfo/ajaxCustomInfoList'
              ,size:'sm'
              ,cellMinWidth: 80
              ,request: {
                  pageName: 'pageNo'
                  ,limitName: 'pageSize'
              }
              ,method: 'post'
        ,where:{
                   status: "0"
                  ,startDate: layui.util.toDateString(new Date()-1000*60*60*24*30, 'yyyy-MM-dd')
         }

 注意:應該算個缺陷,開始進入頁面時查詢的時間參數傳遞到后台了,但是前端頁面上還是沒有顯示出這個時間。

 這里where必須何form.val結合使用。因為只是在where添加查詢條件,但是界面顯示不出來查詢條件的值。

 

        //設置表單初始值
        form.val('searchForm', {
            status: "0"
            ,startDate: layui.util.toDateString(new Date(new Date() - 1000 * 60 * 60 * 24 * 30),'yyyy-MM-dd')
        });

7. Layui iframe如何清理緩存

我用的是iframe的,所以下面這段放到通用的header里面就行了。這樣每次修改了layui內容或者升級版本的時候,在通用的文件中直接修改這里的版本號就可以了。

一直很想吐槽,官方文檔很多地方寫的一知半解的,讓人丈二和尚摸不着頭腦。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/page/commons/taglibs.jsp"%>
<c:set var="ctx" value="${pageContext.request.contextPath}" />
<script type="text/javascript">
    //定義全部變量
    var ctx = "${pageContext.request.contextPath}";</script>
<link type="text/css" href="${ctx}/resources/layuiadmin/layui/css/layui.css" media="all" rel="Stylesheet" />
<link type="text/css" href="${ctx}/resources/layuiadmin/style/admin.css" media="all" rel="stylesheet">
<script type="text/javascript" src="${ctx}/resources/layuiadmin/layui/layui.js"></script>
<script> layui.config({ version: '20190604' ,base: ctx + '/resources/layuiadmin/' }); </script>

 

 

8. 關於彈窗高度自適應寫法

我原來是寬度和高度,都是手工寫的。每次表單增減字段時,也是手工去改這個高度。

原來以為只有我這么干的,后來在群里聊天發現也有很多跟我一樣,也是這么手工調整的。

 

在彈窗的成功回調函數中寫layer.iframeAuto(index); 

                   var index2 = layer.open({
                        title: '添加報廢單'
                        ,type: 2
                        ,offset: '50px'
                        ,area: '60%'
                        ,content: ctx + '/saleReturnOrder/popScrap?id='+ line.id
                        ,success: function(layero, index){
                           layer.iframeAuto(index);
                        }
                    });  

看看官方文檔,呵呵,有些東西一點就破,很多時候是因為差了那么一點點火候 :

 

9. table中的數據校驗

這段也是在社區里面扒出來的,用於在table中使用編輯表格時的校驗,功能體驗很贊:

    //數據校驗
    table.on('edit(tableList)', function(obj){
   
     var lineData = obj.data;
     var value = obj.value;
     var field = obj.field;
     var inputElem = $(this);
     var tdElem = inputElem.closest('td');
     var valueOld = inputElem.prev().text();
     var  data = {};
     var errMsg = ''; // 錯誤信息
    
         if (field === 'tmpRepairQty') {
          var re = /^(\-|\+)?\d+(\.\d+)?$/;
          if (!re.test(value)) {
            errMsg = '只允許輸入數字';
          }
          if (value < 0) {
             errMsg = '數量不允許小於0';
          }
          var returnQty = lineData.returnQty | 0;
          var scrapQty = lineData.scrapQty | 0;
          var repairQty = lineData.repairQty | 0;
          var value = value | 0;
          var openQty = returnQty - scrapQty - repairQty;
          if(value > openQty ){
              errMsg = '數量不允許大於未結數量' + openQty;
          }
        }
        

if (errMsg) { // 如果不滿足的時候 data[field] = valueOld; layer.msg(errMsg, {time: 1000, anim: 6, shade: 0.01}, function () { inputElem.blur(); obj.update(data); tdElem.click(); }); }

10. 如何在layui中使用echarts

首先使用繼承方式引入echarts和echartsTheme,注意兩個都要,一個頁面中只需要引入一次。

然后輪播切換這段函數也要保留。不然圖片沒法顯示。

下面的ajax請求根據echarts官方文檔,自己發揮。

  //最近30天成交趨勢
layui.extend({
     echartsTheme: 'lib/extend/echartsTheme' 
    ,echarts: 'lib/extend/echarts'
}).use(['carousel', 'echarts'], function(){
        var $ = layui.$
        ,carousel = layui.carousel
        ,element = layui.element
        ,device = layui.device();

        //輪播切換
        $('.layadmin-carousel').each(function(){
          var othis = $(this);
          carousel.render({
            elem: this
            ,width: '100%'
            ,arrow: 'none'
            ,interval: othis.data('interval')
            ,autoplay: othis.data('autoplay') === true
            ,trigger: (device.ios || device.android) ? 'click' : 'hover'
            ,anim: othis.data('anim')
          });
        });

//-------------------------以上必須要---------------------------------------------------
$.ajax({ url: ctx
+'/biGeneral/ajaxLineChart' ,type:'post' ,dataType: 'json' ,success: function(res){ var echartsApp = [], options = [{ tooltip : {trigger: 'axis'}, calculable : true, legend: {data:['訂單量','銷售額'] }, toolbox: {show : true, feature : { magicType : {show: true, type: ['line', 'bar']}, restore : {show: true}, saveAsImage : {show: true} } }, xAxis : [{ type : 'category',data :res.date }], yAxis : [{type : 'value', name : '訂單量', axisLabel : {formatter: '{value} 個'}}, {type : 'value', name : '銷售額', axisLabel : {formatter: '{value} 元'}} ], series : [ {name:'訂單量', type:'line', data: res.orderCount, markPoint: {data : [{type : 'max', name: '最大值'},{type : 'min', name: '最小值'}]} }, {name:'銷售額', type:'line', yAxisIndex: 1, data: res.saleAmt, markPoint: {data : [{type : 'max', name: '最大值'},{type : 'min', name: '最小值'}]} }, ] }] ,elemDataView = $('#trade_last30day').children('div') ,renderDataView = function(index){ echartsApp[index] = echarts.init(elemDataView[index], layui.echartsTheme); echartsApp[index].setOption(options[index]); window.onresize = echartsApp[index].resize; }; //沒找到DOM,終止執行 if(!elemDataView[0]) return; renderDataView(0); } //success }); }); });

 截圖是隨便截的,不代表上面代碼。

 

 

 

11. layui表格行工具欄和表格頭工具欄監聽

已知表格設置如下:

<table id="lay-tableList" lay-filter="laytool"></table> 

1)表格頭設置:

定義模版,設置唯一id值,添加事件選擇器lay-event,然后在渲染時綁定到table中。

        <script type="text/html" id="toolbar">
        <div class="layui-btn-container">
                <button class="layui-btn layui-btn-sm layuiadmin-btn-list" lay-event="add">新增</button>
                <button class="layui-btn layui-btn-sm layuiadmin-btn-list" lay-event="refresh">刷新</button>
        </div>
        </script>

 

設置表格頭按鈕監聽事件,這里table.on()里面是toolbar,意思為監聽表格頭,括號里面與table的lay-filter保持一致。

    //監聽表格頭工具欄
    table.on('toolbar(laytool)', function(obj){
        if(obj.event === 'add') {
        //新增邏輯
        };
        
        if(obj.event === 'refresh'){
            //刷新邏輯
        }
        
    });

2)表格行按鈕監聽

定義模版,設置唯一id值,添加事件選擇器lay-event,然后在渲染時綁定到table中。

        <script type="text/html" id="toolline">
                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>編輯</a>
                <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>刪除</a>
        </script>   

設置表格行按鈕監聽事件,這里table.on里面是tool,括號里面與表格的lay-filter保持一致。

    //監聽行工具條
    table.on('tool(laytool)', function(obj){
              var selected = obj.data;
              var layEvent = obj.event; 
              
              //修改維修單
              if(layEvent === 'del'){
                  //刪除邏輯
              }
              if(layEvent === 'edit'){   
           //編輯邏輯 } });

 

最后表格的完整渲染:

在渲染元素中添加toolbar,即表示頭工具欄。

在cols元素中添加 '操作' 字段, 設置toolbar對應的模版id值toolline。

        table.render({
              elem: '#lay-tableList'
              ,url: ctx+'/dictList/ajaxPageList'
              ,size:'sm'
              ,cellMinWidth: 60 
              ,toolbar: '#toolbar'
              ,request: {
                  pageName: 'pageNo'
                  ,limitName: 'pageSize'
              }
              ,cols: [[
//                  {type: 'checkbox', fixed: 'left'}
                ,{field: 'id',title: 'id', hide:true}
                ,{field: 'code', title: '編碼'}
                ,{field: 'codeName', title: '編碼-說明'}
                ,{field: 'value1', title: '值'}
                ,{field: 'value1Name', title: '值-說明'}
                ,{field: 'value2', title: '值2'}
                ,{field: 'value2Name', title: '值2-說明'}
                ,{field: 'isDefault', title: '默認值', width:70 ,templet:function(d){ return d.isDefault == '1' ? '是' : '否';}}
                ,{field: 'sortNum', title: '排序號', width:70 }             
                ,{title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#toolline'}
              ]]
        ,page: true
        ,limit: 15
        ,limits: [10, 15, 20, 25, 30]
        ,text: {none: '暫無相關數據'}
    });

 

最后頁面顯示如下:

 

12. 數組操作

//1. 數組中判斷對象是否存在,根據id判斷    
    Array.prototype.indexOf = function(val){
            for(var i=0; i<this.length; i++){
                if(this[i].id == val) return i;
            }
            return -1;
        };
//2. 數組中是篩選記錄
selectData = oldData.filter(item => item.id !== selected.id);

 

 

 

 

如果有好的問題,歡迎留言或者站內消息給我。

 

 

 

 

 

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM