2019/11/26 学习笔记
树的学习
- 首先需要建立一个类实现TreeContentProvider接口,并实现getElements方法
- 然后在表单新建树形数据源,选择custom,再选刚刚新建的类
- 最简单的树:通过TreeNode定义节点数组,再对相应节点进行赋值,最少需要两个参数,节点id,节点值
TreeNode[] tn = new TreeNode[3];
tn[0] = new DefaultTreeNode("0","aa");
tn[1] = new DefaultTreeNode("1","bb");
tn[2] = new DefaultTreeNode("2","cc");
return tn;
效果:
- 分层的树和具有远程搜索的树(具有远程搜索需现在界面打开远程搜索)
解释一下:首先在第一次搜索时返回了三个节点:aa,bb,cc
然后设置了aa的Parent为true,表面它是个父节点具有子节点,
然后前端如果点击父节点,就会再次调这个函数,通过id,
然后发现id=0的话就会返回tn2的两个节点:aa1,aa2
最后如果通过搜索框搜索666的话,会返回tn3的treeRemoteSearch
Object id = context.getConditions().get("id");
Object treeRemoteSearch = context.getConditions().get("treeRemoteSearch");
//远程搜索时的数据模拟
TreeNode[] tn3 = new TreeNode[1];
tn3[0] = new DefaultTreeNode("666","treeRemoteSearch");
if("666".equals(treeRemoteSearch)) return tn3;
//第二次查询时的数据模拟。
TreeNode[] tn2 = new TreeNode[2];
tn2[0] = new DefaultTreeNode("01","aa1");
tn2[1] = new DefaultTreeNode("02","aa2");
if("0".equals(id)) return tn2;
//第一次查询时的数据模拟。
TreeNode[] tn = new TreeNode[3];
DefaultTreeNode dtn1 = new DefaultTreeNode("0","<font color='red'>aa</font>");
dtn1.setParent(true);
tn[0] = dtn1;
tn[1] = new DefaultTreeNode("1","bb");
tn[2] = new DefaultTreeNode("2","cc");
return tn;
效果:
- 第三种:通过list返回某个节点的子节点
TreeNode[] tn = new TreeNode[3];
List<DefaultTreeNode> children = new ArrayList<DefaultTreeNode>();
children.add(new DefaultTreeNode("01","aa1"));
DefaultTreeNode dtn1 = new DefaultTreeNode("0","aa");
dtn1.setChildren(children);
tn[0] = dtn1;
tn[1] = new DefaultTreeNode("1","bb");
tn[2] = new DefaultTreeNode("2","cc");
return tn;
其中树的前端方法,靠自己实践了。
- 第四种:DynamicTreeNode(Hash Map的实现类)
public DynamicTreeNode(String pid, String id, String name,boolean isParent)
pid父层标识或者说父级的id,id本层标识
除了必须要的几个属性外,可以添加自定义属性。
TreeNode[] tn = new TreeNode[2];
//public DynamicTreeNode(String pid,String id,String name,boolean isParent)
DynamicTreeNode dtn1 = new DynamicTreeNode("0","1","aa",true);
//DynamicTreeNode和DefaultTreeNode不同,可以添加自定义属性
dtn1.put("age", "20");
DynamicTreeNode dtn2 = new DynamicTreeNode("1","2","aa1",false);
dtn2.put("age", "21");
tn[0] = dtn1;
tn[1] = dtn2;
return tn;
- 第五种: getTreeNode,通过对象获取动态树节点对象。注意:对象中的class属性会被忽略;pid,id,name,isParent属性会pid,id,name,isParent参数覆盖。
public static DynamicTreeNode getTreeNode(String pid, String id,String name, Boolean isParent,Object obj)
可以自己定义实体,在我感觉,实体类并不一定需要pid,id,name,isParent属性。
TreeNode[] tn = new TreeNode[2];
//getTreeNode(pid, id, name, isParent, obj)
//TestObject包含int id,int pid,String name三个属性,同时有相应的Getter/Setter方法,即是一个entity,
//下同。
TestObject s1 = new TestObject();
//通过对象获取动态树节点对象。
DynamicTreeNode dtn1 = TreeNodeFactory.getTreeNode("0", "1", "aa", true, s1);
TestObject s2 = new TestObject();
DynamicTreeNode dtn2 = TreeNodeFactory.getTreeNode("1", "2", "aa1", false, s2);
tn[0] = dtn1;
tn[1] = dtn2;
return tn;
我的实体是没有pid,id,name,isParent属性的
效果:
第六种:getTreeNodes,可以将集合批量转换为树节点集合。所有节点都默认为父节点。如果需要单独空值节点,请使用 #DynamicTreeNode() 方法。public static List getTreeNodes(List<?> list, String pidFieldName, String idFieldName,String nameFieldName)
我的理解:可以将一个集合的对象批量转换成树节点集合,但是集合里的对象需要有相应的pid,id,name属性,方法的后面三个参数就是设置相对应的属性。
TreeNode[] tn = null;
if(context.getPid() != null){
}else{
List<TestObject> list = new ArrayList<TestObject>();
TestObject s1 = new TestObject();
s1.setId(1);
s1.setPid(0);
s1.setName("aa");
list.add(s1);
TestObject s2 = new TestObject();
s2.setId(2);
s2.setPid(1);
s2.setName("aa1");
list.add(s2);
tn = new TreeNode[list.size()];
// getTreeNodes(public static List<TreeNode> getTreeNodes(List<?>
// list,String pidFieldName,String idFieldName,String
// nameFieldName);
//可以将集合批量转换为树节点集合。
List<TreeNode> nodes = TreeNodeFactory.getTreeNodes(list, "pid","id", "name");
tn = nodes.toArray(tn);
}
return tn;
效果:
最后写一下我的一些心得:
树的初始化参数:{“dimensionId”:params.dimID}
这样就可以从后台那边取出来
前端可以在页面加载前定义这个:params.dimID
然后需要更改这个的dimID的时候用树的刷新方法:(后面几个参数自己了解下)
view.tree.refresh2({dimensionId:$params.dimID},true,true,true,null)
另外 最重要的一点:实体ID一定要String型!!!
一个方法发送了请求,和异步加载正常结束正确流程
方法开始——>发送请求——>方法其他语句——>方法结束——>异步加载的结果和方法运行