1.环境
Ext.js 4.2版本,官方插件 TreePicker.js 试下一个combox的下拉树控件。
本人网上找了很久的下拉框控件,发现许多是由大佬改造等,也有在官方可下载的demo中找到,最终确定采用我们项目的版本。观看其中的控件类的实现代码发现其需要的store为Ext.data.TreeStore。
推荐查看此人博客https://www.cnblogs.com/hythzx/articles/4184585.html
gitee的项目demo https://gitee.com/hythzx/ExtJs4.2TreePicker/blob/master/TreePicker/src/main/webapp/data/treeSingle.json#
2.发现所需的json数据格式
[
{
"icon": "",
"text": "人员列表",
"cls": "",
"check": false,
"roleid": "",
"ord": "",
"children": [
{
"icon": "",
"text": "人员1",
"cls": "",
"roleid": "",
"ord": "",
"children": "",
"pid": "",
"table": "",
"code": "",
"leaf": true,
"expanded": false,
"access": "",
"org": "",
"type": "",
"password": "123",
"CATANO": "",
"id": "USER_1000078",
"username": "xuyx",
"rolename": "",
"parentCataID": "",
"PARENTCATAID": "",
"cataNO": "",
"name": ""
},
{
"icon": "",
"text": "人员2",
"cls": "",
"roleid": "",
"ord": "",
"children": "",
"pid": "",
"table": "",
"code": "",
"leaf": true,
"expanded": false,
"access": "",
"org": "",
"type": "",
"password": "123",
"CATANO": "",
"id": "USER_1000080",
"username": "shenl",
"rolename": "",
"parentCataID": "",
"PARENTCATAID": "",
"cataNO": "",
"name": ""
},
{
"icon": "",
"text": "人员3",
"cls": "",
"roleid": "",
"ord": "",
"children": "",
"pid": "",
"table": "",
"code": "",
"leaf": true,
"expanded": false,
"access": "",
"org": "",
"type": "",
"password": "123",
"CATANO": "",
"id": "USER_1000073",
"username": "ruiqy",
"rolename": "",
"parentCataID": "",
"PARENTCATAID": "",
"cataNO": "",
"name": ""
},
{
"icon": "",
"text": "人员4",
"cls": "",
"roleid": "",
"ord": "",
"children": "",
"pid": "",
"table": "",
"code": "",
"leaf": true,
"expanded": false,
"access": "",
"org": "",
"type": "",
"password": "123",
"CATANO": "",
"id": "USER_1000079",
"username": "zhoulj",
"rolename": "",
"parentCataID": "",
"PARENTCATAID": "",
"cataNO": "",
"name": ""
},
{
"icon": "",
"text": "人员5",
"cls": "",
"roleid": "",
"ord": "",
"children": "",
"pid": "",
"table": "",
"code": "",
"leaf": true,
"expanded": false,
"access": "",
"org": "",
"type": "",
"password": "123",
"CATANO": "",
"id": "USER_1000077",
"username": "jinyj",
"rolename": "",
"parentCataID": "",
"PARENTCATAID": "",
"cataNO": "",
"name": ""
}
],
"pid": "",
"table": "",
"code": "",
"type": "",
"org": "",
"access": "",
"expanded": false,
"password": "",
"CATANO": "",
"id": "ORG_1000050",
"username": "",
"rolename": "",
"parentCataID": "",
"PARENTCATAID": "",
"cataNO": "",
"name": ""
}
]
据本人观察具有children的节点是不能由leaf属性的,具有leaf属性的节点为叶子节点,其值必须为true.如果不满足此结构,其会不停的请求后台接口。js研究了半天也没发现具体发请求的方法在哪一块,索性放弃,从后端树结构来解决。
解决方案1.定位定义一个node节点,从构建树的时候区分好叶子节点上多一个leaf属性创建树结构。由于又要创建树结构从xml层往上写,比较麻烦,暂未进行
class BaseNode{
String id;
String pid;
String text;
}
class TreeNode extends BaseNode{
List<BaseNode> children;
}
class Leaf extends BaseNode{
boolean leaf;
}
解决方案2:通过对生成的json串来进行操作。采用工具阿里的fastjson工具。原先的树节点会返回所有的属性,即均包含leaf属性,且leaf属性位false.超级不满足我的需求。
采用PropertyFilter、ValueFilter来处理字符串。
PropertyFilter profilter = new PropertyFilter(){
@Override
public boolean apply(Object object, String name, Object value) {
JSONObject parseObject = JSON.parseObject(JSONUtil.toJsonStr(object));
boolean contains = parseObject.keySet().contains("children");
if(contains&&ObjectUtil.isNotNull(parseObject.get("children"))){
if(name.equalsIgnoreCase("leaf")){
//false表示leaf字段将被排除在外
return false;
}
}
return true;
}
};
ValueFilter valueFilter = new ValueFilter() {
@Override
public Object process(Object o, String propertyName, Object propertyValue) {
if(propertyName.equals("leaf")){
return true; //返回修改后的属性值对象
}
return propertyValue;
}
};
String res = JSON.toJSONString(root, new SerializeFilter[]{profilter, valueFilter});
从上述代码中,首先筛掉children节点的leaf属性,再晒剩余的leaf属性的值转为true.fastjson还是很好用的,也采用了工具类hutool
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.9</version>
</dependency>
以后有诸如此类的需求还是推荐使用。作为后端开发,首先想的肯定是后端实现。