2018-09-28

layui学习笔记

1.基本目录

|-css //css样式
    |-layui.css /核心样式文件
    |-modules //此模块相对较大,包含三个子模块
        |-laydate //日历控件
        |-layer
        |-layim
|-font //字体图标
|-image //图片资源
|-lay //模块核心目录
|-layui.js //基础核心库
|-layui.all.js //此模块包含layui.js和所有模块的合并文件

2.下载:官网、Git仓库、npm

3.常用部署

./layui/css/layui.css head中
    <link rel="stylesheet" href="../layui/css/layui.css">
./layui/layui.js body中
    <script src="../layui/layui.js"></script><script>
./layui/layui.alll.js //非模块化的加载方式,不用再使用layui.use()来加载对应模块,即可直接使用
    <script src="../layui/layui.all.js"></script>

4.layui模板定义:

layui.define[mods],function(exports){
    ......
    exports('mod',api);
});
模板使用:
layui.use(['mod1','mod2'], function(args){
    var mod = layui.mod1;
    ......
});

问题

1.编写的是freemarker template language文件,视图层如何响应成网页
2.使用过的模块,可以了解了解源代码,不要一个劲地复制粘贴

1.table模块:

    1.1先在页面需要位置新建table标签:
        <table class="layui-hide" id="tableList" lay-filter="tableFilter"></table>
        //id用于实例化表格时的元素选择器
        //lay-filter用于工具条监听时绑定过滤器
    1.2模块加载基本操作:
        layui.use(['laypage', 'layer', 'table', 'form', 'element','laydate','tree','treeGrid'], function(){
            var laypage = layui.laypage //分页
            ,layer = layui.layer //弹层
            ,table = layui.table //表格 
            ,form = layui.form//表单
            ,element = layui.element//元素操作
            ,tree = layui.tree//
            ,treeGrid = layui.treeGrid
            ,laydate = layui.laydate
            ,$ = layui.$; 
    1.3实例化表格:
        table.render({
            elem: '#tableList'
            ,url: '' //数据接口
            ,page: true //开启分页
            ,msg:'无数据'
            ,cols: [[ //表头
               {checkbox: true, fixed: true}    
              ,{type:'numbers',title: '序号',fixed: 'left'}//fixed
              ,{field: 'purchasingCom', title: '采购单位'}
              ,{field: 'sellCom', title: '销售机构'}
              ,{field: 'operate', title: '操作',toolbar: '#operateTool',fixed: 'right'}
            ]]
            ,data:[{
                 'comCode':'860101'
                ,'purchasingCom':'中科软科技股份有限公司'
                ,'sellCom':'asus'
                ,'batchCode':'00001'
            }]
        });

2.日期模块:

    2.1定义日期输入框
        <div class="layui-inline">
            <label class="layui-form-label">失效日期</label>
            <div class="layui-input-inline">
                <input name="invalidDate" id="invalidDate" class="layui-input" type="text" lay-verify="date">
            </div>
        </div>
    2.2加载模块
    2.3实例化,添加样式
        laydate.render({
            elem: '#invalidDate'
            ,theme: 'grid'
            //管theme有哪些选项:
        });   

3.treeGrid模块

    var treeGrid = layui.treeGrid;//需要单独在layui.js文件中引入treeGrid:"modules/treeGrid"
        var treeTable = treeGrid.render({
        elem: '#orgTree'
        , url: 'getOrgList'//尽量用相对路径,获取json数据
        , cellMinWidth: 100
        , treeId: 'id'//树形id字段名称
        , treeUpId: 'parentId'//树形父id字段名称
        , treeShowName: 'name'//以树形式显示的字段
        , cols: [[ //表头
            {type: 'checkbox'}
            ,{field: 'name', title: '机构名称',width:'30%'}
            ,{field: 'parentId', edit: 'text', title: 'parentId'}
            ,{field: 'areaId', title: '归属区域', sort: true}
            ,{field: 'id', title: '机构编码'}
            ,{field: 'orgType', title: '机构类型', sort: true}
            ,{field: 'remarks', title: '备注',sort: false}
            ,{field: 'operate', title: '操作',toolbar: '#operateTool',width:'20%'}
        ]]
        , page: false
    });

4.Xtree模块

    4.1,Xtree是基于form的,所以先定义form
        <form class="layui-form" >
            <div style="background: #f2f2f2; height: 50px">组织机构
                <i class="layui-icon layui-icon-refresh" ></i>
            </div>
            <div id="demo" style="height:400px;overflow:auto;" class="xtree_contianer"></div>
        </form>
    4.2定义Xtree
        var xtree2 = new layuiXtree({
            elem: 'demo'   //(必填) 放置xtree的容器,样式参照 .xtree_contianer
            , form: form  //(必填) layui 的 from
            //, data: json //(必填) 数据接口,需要返回以上结构的json字符串
            , url: 'getOrgList'
        });

表格中的url和data

单选还是多选

Xtree后台交互格式,treeGrid交互格式,table交互格式

1.Xtree:根据json数组的数据层级展现树状结构
    var json = [
        {
        title: "XX人寿保险股份有限公司", value: "jd1", data: [
            { title: "保险分公司节点1.1", checked: true, disabled: true, value: "jd1.1", data: [] }//添加disabled属性为true之后不允许勾选或取消勾选
            , { title: "保险分公司节点1.2", value: "jd1.2", checked: true, data: [] } //checked属性为true则默认勾选
            , { title: "保险分公司节点1.3", value: "jd1.3", disabled: true, data: [] }
            , { title: "保险分公司节点1.4", value: "jd1.4", data: [] }
            ]
        }
        , {
        title: "XX人寿保险股份有限公司", value: "jd2", data: [
              { title: "保险分公司节点2.1", value: "jd2.1", data: [] }
            , { title: "保险分公司节点2.2", value: "jd2.2", data: [] }
            , { title: "保险分公司节点2.3", value: "jd2.3", data: [] }
            , { title: "保险分公司节点2.4", value: "jd2.4", data: [] }
            ]
        }
    ]
2.treeGrid:不用层级关系实现依靠字段的继承

表格中定义工具条

定义表格并实例化:
    <table class="layui-hide" id="tableList" lay-filter="tableFilter"></table>
    ......
添加script标签,定义操作按钮
    <script type="text/html" id="operateTool">
        <a class="layui-btn layui-btn-xs  layui-btn-warm" lay-event="doIt">清算</a>
    </script>
    其中lay-event的值用
添加列: 
    ,{field: 'operate', title: '操作',toolbar: '#operateTool',fixed: 'right'}
    其中#operateTool为script标签的id
监听工具条
    table.on('tool(tableFilter)', function(obj){ //注:tool是工具条事件名,tableFilter是table原始容器的属性 lay-filter="对应的值"
        var data = obj.data //获得当前行数据
        ,layEvent = obj.event; //获得 lay-event 对应的值
        if(layEvent === 'doIt'){//script子标签的lay-event的值
            popup("卡单批次清算", "batchLiquidationDo","90%");//popup弹出新的小窗口页面,第一个为窗口名,
        };
    });

页面网页弹出popup

popup("批次清算", "batchLiquidationDo","90%");//popup弹出新的小窗口页面,第一个为窗口名,第二个为location,第三个为窗口大小

input-item、input-inline 和 input-block

下拉选带搜索:为select标签添加lay-search属性

<div class="layui-inline">
    <label class="layui-form-label">parentId</label>
    <div class="layui-input-inline">
        <select name="parentId"  lay-search="parentId ">
            <option value="">1</option>
            <option value="">2</option>
            <option value="">3</option>
        </select>
    </div>
</div>

switch 开关

<div class="layui-inline"><!--这个可以做成switch-->
    <div class="layui-form-mid layui-word-aux">是否启用</div>
    <input type="checkbox" name="useable" lay-skin="switch"  lay-text="是|否" >
</div>

layui表格自动渲染:

<table class="layui-table" lay-data="{url:'/api/data/'}" lay-filter="test"> …… </table>

layui-tab

ajax的data.field和data.serialize

通过监听工具条获取标签的innerHTML

treeGrid.on('tool(tableFilter)', function(obj){ 
    tr = obj.tr
    ,id = $(tr).find('td:eq(4)').text()
    ,layEvent = obj.event; //获得 lay-event 对应的值
    console.log(id);
});
始终记得监听工具条的obj参数是相当于整个table的
后期有修正的更简单的

获取表单数据

1.提交按钮,用button 不用submit
    <button class="layui-btn" lay-submit lay-filter="updateOrgDo"><i class="layui-icon layui-icon-ok" style="font-size: 20px;"></i>添加</button>
2.获取数据
    form.on('submit(updateOrgDo)',function(data){
        var param = data.field;//定义临时变量获取表单提交过来的数据,非json格式
        $.ajax({
        ......
        }
        return false;
    }

FTL stack trace ("~" means nesting-related):

    - Failed at: ${ab01.ab0103}  [in template "system/org/addSubOrg.ftl" at line 11, column 19]
----] with root cause
freemarker.core.InvalidReferenceException: The following has evaluated to null or missing:

就是需要的字段为null了,根机构的上级id写成0也不要为NULL

form.on('submit(addBtn)',function(data){

1.addBtn是button 的lay-filter的值
2.

form.verify

form.verify({
  ab0102: function(value){
    if(value.trim()==""){
      return "不能为空";
    }
  }

  ,ab0103: function(value){
    if(value.trim()==""){
      return "不能为空";
    }
  }
});

Xtree/treeGrid/数据接口格式

1.treeGrid:
    code:
    msg:
    count:
    data:
2.Xtree
    code:
    msg:
    tittle:
    value:
    data:
3.table同treeGird

popup和layer.open

popup("添加下级机构", "addSubOrg?ab0101=" + ab0101,"90%");

弹窗关闭,父级页面跳转

1.通过frame序号关闭当前弹窗
    var index = parent.layer.getFrameIndex(window.name);
    parent.layer.close(index);  //关闭弹出框
2.刷新表格,其实是刷新页面
    parent.location.href="orgManagement";  //父级跳转到其他页面去

页面刷新

1 history.go(0)
2 location.reload()
3 location=location
4 location.assign(location)
5 document.execCommand('Refresh')
6 window.navigate(location)
7 location.replace(location)
8 document.URL=location.href

table的reload

function reloadTable(){
    treeGrid.reload('orgTree', {
        where: {
            ab0101: $('#ab0101').val(),
            ab0102: $('#ab0102').val()
        }
    });
};
当然可以直接调用Table的reload函数,layui已经封装

Layui hint: treeSelect is not a valid module

当你遇到类似这样报错,说某某某不是一个有效的模块时,不防在layui.js前引入jquery,也许错误就被解决啦!
继续,修改了模块文件,统一了大小写,但并不知道对不对,没有报错,下拉也出来了,但是收缩效果体验很差

使用table或者treeGrid的checkbox

var active = {//讲选中的行数封装成data数组
    showOrgan: function(){
        var checkStatus = treeGrid.checkStatus('organTree')
            , data = checkStatus.data;
        if (data.length != 1) {
          layer.msg('请选择一行查看,已选['+data.length+']行', {icon: 5});
          return false;
        }
            popup("查看详情", "showOrgan?ab0101=" + data[0].ab0101, "80%");
        }
};

下拉树的实现,详见页面代码

layui tree的常用:

tree({
     elem: "#treeselect" ,
     nodes: obj.data,
     click: function (node) {
         var $select = $($(this)[0].elem).parents(".layui-form-select");
         $select.removeClass("layui-form-selected").find(".layui-select-title span").html(node.ab0603).end().find("input:hidden").val(node.ab0601);
     }
 });

异步请求获取treeselect节点列表

 $.ajax({
    url: 'selecteTree',
    type: 'post',
    dadatype: 'json',
    success: function(obj){
        val = obj.data;
         tree({
             elem: "#treeselect" ,
             nodes: obj.data,
             click: function (node) {
                 var $select = $($(this)[0].elem).parents(".layui-form-select");
                 $select.removeClass("layui-form-selected").find(".layui-select-title span").html(node.ab0603).end().find("input:hidden").val(node.ab0601);
             }
         });
    }
 });
实测在nodes属性赋值时直接调用createTree方法无效

上述代码实现下拉树之后,无法实现下拉选

下拉树测试代码:
var testData =
    [{
        ab0103: '节点1',
        name: '节点1',
        ab0101: 1,
        ab0108: 0,
        children: [{
            ab0103: '节点1.1',
            name: '节点1.1',
            ab0101: 11,
            ab0108: 1}, 
            {
            ab0103: '节点1.2',
            name: '节点1.2',
            ab0101: 12,
            ab0108: 1},
            {
            ab0103: '节点1.3',
            ab0101: 13,
            name: '节点1.3',
            ab0108: 1}
        ]
    },
        
    {
        ab0103: '节点2',
        name: '节点2',
        ab0101: 2,
        ab0108: 0,
        children: [{
            ab0103: '节点2.1',
            name: '节点2.1',
            ab0101: 21,
            ab0108: 2}, 
            {
            ab0103: '节点2.2',
            name: '节点2.2',
            ab0101: 22,
            ab0108: 2},
            {
            ab0103: '节点2.3',
            name: '节点2.3',
            ab0101: 23,
            ab0108: 2}
          ]}
    ];
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 不知身所起 不知身何往 孑然一身 无所根系 遥问老者 一路红尘 何苦最甚 老者答 存在即为苦 存在亦为乐 忘记苦乐...
    色暮阅读 240评论 0 0
  • 雪染万物皆皑皑,祭祖踏青人接踵。面带幽思心悲凉,缅怀故亲语哽喉。又为一年清明节,焚香添土将亲祭。
    随缘_4c40阅读 260评论 0 0
  • 这是一个矛盾体 高三最后一年我拼命学,好像突然成长许多,可惜我没考上本科学历,不过我不后悔,我努力了,这是我坚持...
    是橘子君吧阅读 287评论 0 0
  • 云知道️《财富悟语》来啦…2018年7月30日周一 【Chapter1 启智篇】 对未来的迷惑,糟蹋了我...
    福气东来阅读 138评论 0 0