EasyUI相关知识整理

EasyUI是一种基于jQuery、Angular.、Vue和React的用户界面插件集合。easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能。也就是说EasyUI只负责提供界面插件,其内部的实现可以基于三大前端框架或者jQuery。

jQuery is a JavaScript library designed to simplify HTML DOM tree traversal and manipulation, as well as event handling, CSS animation, and Ajax.It is free, open-source software using the permissive MIT LicenseWeb analysis indicates that it is the most widely deployed JavaScript library by a large margin. ——维基百科

在当前的项目中,主要是基于jQuery库的使用经验,总结起来有以下几个方面需要整理:

  • 界面浮框:包括window、dialog等浮动窗口,这些窗口的创建以及销毁。
  • 下拉框:包括下拉框的赋值、初始化、属性设置、联动等常见操作。
  • 表格:DataGrid控件每一行内容的按钮添加,数据加载,行删除等常见操作。
  • 表单:表单的提交操作,以及附件的提交操作。
  • 树型结构:包括置空、设置图标、设置双击单击事件。

界面浮框

基本属性

<div id = "info" class ="easyui-window" title="信息"
data-option="modal:true,shadow:false,closed:true, iconCls:'icon-save',minimizable:false,maximizable:false,onClose:function(){clearBugWindow()}" style="width:900px;max-height: 750px;padding: 10px">
</div>

具体的属性可以结合JqueryEasyUI API文档去查询,但是在实际的项目中就是如上面那样使用。

  • shadow属性:该属性如果设置为true将导致window内部的内容如果折叠,会导致出现莫名其妙的阴影。
  • modal属性:该属性设置为true表示为模式化窗口——除非关闭该窗口,否则无法操作其他窗口。
  • resize方法:该方法一般用于调整窗口的初始化位置,一般使用如下方式进行操作:

    $('#id').window('resize',{top: ($(window).height() - 750) * 0.5});

与dialog的混淆

在实际开发中,可能定义一个控件为easyui-window,但是在调用方法的过程中,使用$("#id").dialog('functionName')。这种情况是不规范的,但是也可以生效,因为dialog是对window的扩展,所以可以认为window可以使用的方法,dialog都可以实现。

dialog可以看作是特殊的window,它具有window所不具有的属性。比如toolbar,buttons,用于定义上方的工具栏和下方的按钮。

Destroy销毁和Close关闭

close只是将窗体隐藏起来,而destroy意味着将内容销毁。在实际的使用过程中,如果dialog或者window是显示定义在html元素中,close后可以调用open再打开,但是destroy后就无法再使用窗体,除非刷新页面重新初始化元素

场景描述

网站的首页有一个主框,所有的子功能模块都是以tab页面的形式呈现,每当选项卡发生改变时,都会刷新页面,这样也就导致用户在两个已经打开的选项卡之间交替作业十分不方便。于是修改逻辑,只当用户点击左侧导航栏时,刷新选项卡;当用户点击已经存在的选项卡时,不刷新选项卡。

问题在于如果对dialog执行destroy后,必须刷新tab来重新创建dialog,需要使用tabs的update方法,然后执行panel的fresh方法,代码如下:

addTab:function(titel,url){

openedTabs[title] = url;//使用一个数组来保存title与url的映射关系

if(title == "A"){

$('#A_dialog').dialog('destroy');

} else if(title = "B"){

$('#B_window').window('destroy');

}

if(tab.tabs('exists',title)){

tab.tabs('select',title);

var tab = tab.tabs('getSelected');

tab.tabs('update',{

tab: tab,

options:{

title:titel,

href:url

}

});

tab.panel('refresh'); //在update后还需要refresh

}else{

tab.tabs('add',{

title:titel,

closable:true,

href:url

});

}

}

下拉框

基本操作

创建方式既可以在HTML标签中增加class="easyui-combobox"属性,也可以在JavaScript代码中对下拉框元素进行初始化:$("#id").combobox({……})。

具体的属性可以结合JqueryEasyUI API文档去查询,需要注意的属性包括limitToList属性(1.5.5版本的easyUI有该属性,但是再往前的版本不一定有这个属性),textField和valueField的属性绑定,$('#id').combobox('loadData',data),combobox('reload','url')等。掌握这些方法可以实现下拉框组件的基本使用。

进阶操作

  • 初始化下拉框时,自动选择第一行:解决思路是再combobox初始化完成后,使用getData方法获取combobox的全部数据,获取combobox控件中的options属性,找到textField属性对应的值,找到valueField属性对应的值,然后执行select方法。
    selectFirstLineOfCombobox: function(target){
var data = $(targe).combobox("getData");
var options = $(target).combobox("options");
var text = options['textField'];
var valueField = options['valueField'];
$(target).combobox("select",data[0][text]);
$(target).combobox("setValue",data[0][valueField]);
}
  • 设置部分下拉框选项不能选中:解决思路是在返回Json数据给combobox时,手动在需要禁止的数据中设置disabled为true。
    public void getEditStatusInfo(){
JSONArray array = convertDefectClientDataToDisplayData();
for(int i = 0;i < array.size();i++){
JSONObject object = array.getJSONObject(i);
int statusValue = object.getIntValue("id");
if(statusValue == 1||statusValue == 2||statusValue == 3){
continue;
}
object.put("disabled" , "true");
}
renderJson(array);
}
  • 设置下拉框的联动效果:解决思路是在combobox的onSelect方法中使用Ajax方法获取其他需要联动的combobox中需要加载的数据。
onSelect: function(rec){
var devUrl = '/getdata';
var devData = $.ajax({
url: devUrl,
async: false;
});
var devResponse = eval('(' + devData.responseText + ')');
var devLength = devResponse.length;
if(devLength == 0){
return;
}
$("#B").combobox('loadData',devResponse);
}
  • 下拉框带层级的选项内容:解决思路是在需要显示的Json字符串中,添加一个group属性,通过不同的group属性来对下拉框中的内容进行分类。

表格

基本操作

在js代码中设置datagrid,需要注意重点的属性columns,pagination等属性。column中主要涉及到绑定的表格字段名,paginate涉及到控件默认的分页参数(该属性设置为true,在后台可以拿到"page"参数以及"rows"参数)。需要注意的方法包括appendRow、selectRow、deleteRow等一系列和行相关的操作,主要用于在实际业务中增加行、删除行。

注意loadData方法,对于表格而言不是单传的加载Json数据,而是要连同行数一起加载,如下所示:

$('#id').datagrid('loadData',{total: 0, rows: []});

进阶操作

  • 在每一行中添加删除按钮:解决思路,在columns属性中添加一列用于容纳按钮,使用name属性来识别该表格内的同一类按钮。
columns:[[
{field: 'attachmentName', title:'附件名称', width:250},
{
field:'operation', title: '操作', width: 170,
formatter: function(value, row, index){
var str = '<a href="#" name="attachment_delete_button" class="easyui-linkbutton" data-options="onClick:function(){deleteAttachment(' + index + ')}"></a>';
str = str + '&nbsp;&nbsp;<a href="#" name="attachment_download_button" class="easyui-linkbutton" data-options="onClick:function(){downloadAttachment(' + index +')}"></a>';
return str;
}
}
]],
onLoadSuccess: function(data){
$("a[name='attachment_delete_button']").linkbutton({text:'删除', plain:true, iconCls: 'icon-remove'});
$("a[name='attachment_download_button']").linkbutton({text:'下载', plain:true, iconCls: 'icon-download'});
}

留意formatter属性中的三个参数,value、row、index,这三个参数提供了很大的自由度,针对每一行的内容进行个性化的逻辑处理,比如在这里需要删除单行内容,将index传递给删除方法即可删除指定的行,当然这里又涉及到一个问题,删除行之后index混乱,导致后续的删除有问题,接下来讨论这个问题。

删除行后导致index混乱:解决思路是在删除行后重新加载datagrid,对于从url加载数据的表格而言,直接调用datagrid('reload')方法即可,对于在前端使用datagrid('appendRow')方法生成的表格而言,reload无法生效,此时需要:获取数据、重新加载,如下代码:

var rows == $('#id').datagrid('getRows');
$('#id').datagrid('reload');

删除的过程中使用提示框:为了更好的用户体验,防止用户误删记录,一般会在用户删除之前提示用户是否需要进一步删除,在这里用到了easyUI封装好的Messager提示框,在项目中一般会在easyUI提供的方法外面再套一层,实现如下所示:

message: {
info: function(message){
$.messager.alert("提示", message, "info");
},
error: function(message){
$.messager.alert("错误", message, "error");
},
confirm: function(message, fn){
$.messager.confirm("提示", message, function(r){
fn(r);
});
}
}
  • 表格中的formatter使用:使用formatter可以对列属性进行定制输出,比如特定的颜色、将value转换为对应的汉字等。
{
field: 'start_time',
title: '开始时间',
align: 'center',
width: '120px',
formatter: function(value){
if(null == value){
return "--";
}
return '<span style="color:#238E23;">' + value + '</span>';
}
}

表单

基本操作

表格一定得保证排版整洁、清晰,一般会在外面使用一个div框,包含相关的内容。里面可以包括多个form表单、以及通过该表单出现的浮窗、其他被div包裹的工具栏等信息。然后使用固定的样式对元素进行排版,还可以加上fieldset元素、legend元素(这两个元素一般一起使用),美化表单界面如下所示:

<div>
<form>
<fieldset>
<legend>
</legend>
<div>
//每一行用一个div包裹起来,并且给每个div加上class属性,控制样式
</div>
<div>
<span>描述</span>
<input/> //输入栏
</div>
</fieldset>
</form>
<div id="buttons">
<a id="submit" onclick="submitForm()" href="javascript:void(0)" class="easyui-linkbutton">提交</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="closeWindow()"></a>
</div>
</div>
submitForm: function(){
$("#formid").form({
url:url,
onSubmit: function(param){
//to do something
},
success: function(data){
//to do something
}
});
}
  • 表单中的附件提交

    使用form元素,需要加上enctype="multipart/form-data" 的属性,method使用post属性。

树形结构

使用div包裹树状图以及工具栏

<div id="window" class="easyui-window" title="所属模块" hidden data-options="iconCls:'icon-save',modal:true,closed:true">
<div id="tree">
<ul id="structure_tree"></ul>
</div>
<hr>
<div id="test">
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="select()">确定</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="close()">取消</a>
</div>
</div>
$('#structure_tree').tree({
lines: true,
animate: true,
dnd: true,
url: url
})

基本操作

  • 设置图标

    在返回后台的数据中遍历每一个节点对象,然后设置其iconCls属性即可
  • 置空

    如果要将树形结构控件置空,需要使用$('#tree').tree('loadData',{})进行数据清空
  • 双击事件

    存在一个onDblClick()方法,用于监听树状控件的双击事件

进阶操作

  • 异步树

    用户需要在返回的节点设置"state:closed"的属性,这样用户在点击展开按钮时会往url中添加一个参数id,用户可以通过这个id获取到该节点下的Children,从而构造JsonArray结构的数据返回。

  • 树形结构数据的构造

    需要让节点具备以下的条件:

  • 具有parentId属性。叫什么名字无所谓,只需要能够通过这个parentId属性找到父节点即可。如果是处在顶层的节点,则需要给parentId一个默认的值,比如-1。
  • 具有Children属性。这个属性是一个JsonArray,所有该节点下的子节点,都会保存在该属性中。
  • 具有id属性。节点本身的id。

有了以上三个属性即可参与到树形结构数据的创建中,只需要一次遍历即可得到树形结构。每遍历到一个节点,就找到他的父节点,然后将他放入父节点的children属性中;如果找不到父节点,表示该节点是顶层节点,单独放入到一个列表中。

如此遍历一遍,顶层节点中实际上就已经包含了所有的节点,然后构造一个总的根节点,将顶层节点放到根节点的children属性中即可。代码如下:

JSONObject directoryRootNode = new JSONObject(true);
directoryRootNode.put("id","dir_-1");
directoryRootNode.put("text","root");
directoryRootNode.put("state","open");
directoryRootNode.put(CHILDREN, new JSONArray());
……
for(Integer directoryId : directoryNodeMap.keySet()){
JSONObject directoryNode = directoryNodeMap.get(directoryId);
JSONObject parentNode = directoryNodeMap.get(directoryNode.getInteger("parentId"));
if(null == parentNode){
directoryRootNode.getJSONArray(CHILDREN).add(directoryNode);
continue;
}
parentNode.getJSONArray(CHILDREN).add(directoryNode);
}
……
JSONArray result = new JSONArray();
result.add(directoryRootNode);
return result;

EasyUI相关知识点整理的更多相关文章

  1. Spring和Springboot相关知识点整理

    简介 本文主要整理一些Spring & SpringBoot应用时和相关原理的知识点,对于源码不做没有深入的讲解. 1. 思维导图 右键新窗口打开可以放大. 说明 使用@Configurati ...

  2. Java容器相关知识点整理

    结合一些文章阅读源码后整理的Java容器常见知识点.对于一些代码细节,本文不展开来讲,有兴趣可以自行阅读参考文献. 1. 思维导图 各个容器的知识点比较分散,没有在思维导图上体现,因此看上去右半部分很 ...

  3. iframe高度相关知识点整理

    IFRAME 元素也就是文档中的文档. contentWindow属性是指指定的frame或者iframe所在的window对象. 用iframe嵌套页面是,如果父页面要获取子页面里面的内容,可以使用 ...

  4. javascript位置相关知识点整理

    1.css指定元素的位置采用的是文档坐标: 2.js查询元素位置的方法返回的是元素在视口中的位置,即视口坐标: 如何获得元素的位置和尺寸 获得元素的位置和尺寸可以通过getBoundingClient ...

  5. H5相关知识点整理

    01-HTML5基础 了解HTML5 ☞HTML5属于上一代HTML的新迭代语言,设计HTML5最主要的目的是为了在移动设备上支持多媒体!!! 例如: video 标签和 audio 及 canvas ...

  6. 小型移动 webApp Demo 知识点整理

    包括内容: css初始化.css全局设置.常用meat标签.rem适配.flex布局.相关技巧(手势库使用.多行截字.1像素边线.点击状态.placeholder居中等) reset 引用 norma ...

  7. Caffe学习系列(二)Caffe代码结构梳理,及相关知识点归纳

    前言: 通过检索论文.书籍.博客,继续学习Caffe,千里之行始于足下,继续努力.将自己学到的一些东西记录下来,方便日后的整理. 正文: 1.代码结构梳理 在终端下运行如下命令,可以查看caffe代码 ...

  8. php正则相关知识点

    关于正则,其实简单就是搜索和匹配.php,java,python等都是支持正则的,php正则兼容perl.好多同学觉得正则比较难,比较抽象,其实正则是非常简单的,主要是一个熟悉和反复练习的结果,还有一 ...

  9. vue前端面试题知识点整理

    vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

随机推荐

  1. 【BZOJ4025】二分图

    Description 神犇有一个n个节点的图.由于神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...

  2. Angularjs 学习笔记

    Angularjs 表单验证:https://www.w3xue.com/jsjq/angularjs/angularjs-validation.html https://www.cnblogs.co ...

  3. 定时 清理 elasticsearch 6.5.4 的 索引 文件

    #!/bin/sh ip='127.0.0.1' port=' day=`date -d "2 days ago" +%Y%m%d` #day=`date -d "5 h ...

  4. OpenGL矩阵变换,坐标空间变换

  5. Android学习:Notification状态栏通知

    Notification是显示在手机状态栏的通知,它代表一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification.在小米手机上,手指在屏幕顶端向下划 ...

  6. JS备忘

    1. Promise用法 js异步调用较多,如果某个操作是基于上个异步结果才能执行的,再有一个操作又是基于此操作的,则需要嵌套多层代码,在ES6中引入了Promise写法,可以比较优雅的解决这个问题: ...

  7. [原]Jenkins(十九) jenkins再出发之jenkins邮件通知

    1.下载插件: 2.配置插件: 3.邮件插件配置 4.设置触发器:

  8. Linux 的基本操作(系统的远程登录)

    系统的远程登录 首先要说一下,该部分内容对于linux初学者来讲并不是特别重要的,可以先跳过该章节,先学下一章,等学完后再回来看这一章. Linux大多应用于服务器,而服务器不可能像PC一样放在办公室 ...

  9. iframe 加载外部资源,显示隐藏loading,onload失效

    在项目中使用iframe 来加载外部资源,需要在iframe请求外部资源的时候,需要显示一个loading,在加载完成后,将这个loading隐藏掉,刚开始看到W3C中 iframe有一个 onloa ...

  10. linux中的pwd

    https://www.cnblogs.com/crazylqy/p/5818745.html