extjs4.2 动态加载树 treePanel

来源:互联网 发布:ip 网络层 编辑:程序博客网 时间:2024/04/29 15:02

extjs4.2 动态加载树 treePanel(第一种方法)

        由于项目的需求,需要写一个动态的树(treePanel),具体的数据从数据库中查询出来,搞了我差不多两天的时候,都没有能够在extjs的前台正确的显示出来,网上参考了无数例子,修改了N多遍,都是无法实现。采用了两种方法,一种就是在前台获取数据以后,使用treeNode,郁闷的是extjs4.0以后就没有treeNode了,只有Node,然后在使用getNodeById()的时候一直无法实现,还有一种方法就是在后天拼树,然后前台接收显示,这个方法在网上倒是有很多的例子,但是都无法实现(extjs4.0以后修改了很多的东西啊)。

        终于在查看了extjs4.2的源码后,发现了有个treegrid.json文件,打开一看,果然第二中方法还是返出来的json的格式不符合要求,所以一直无法实现啊。修改了一下,终于完成,现把代码贴出来,以供大家参考和自己以后方便再次使用,

后台拼接树形返回json的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
/**
    * Event公开: 返回拼接好的树形的json
    * @return
    * @throws IOException 
    */
   public String releaseSearch() throws IOException {
       // 查询结果
       HashMap<StringObject> map = new HashMap<StringObject>();  
       CategoryDto  categoryDto = new CategoryDto();
       categoryDto.setFlg(DeleteStatus.NORMAL); 
       List<CategoryDto> items = categoryService.searchItems(categoryDto); 
       List<Category> li = new ArrayList<Category>();
       List<Category> liP = new ArrayList<Category>();
               
       for(int i = 0; i<items.size(); i++){ 
           CategoryDto dto = items.get(i);
           Category c = dto.getCategory();
           // 所有的Category
           li.add(c);
           // 根节点的Category
           if(c.getCategory()==null||c.getCategory().getId()==null||"".equals(c.getCategory().getId())){
               liP.add(c);
           }
       
       // 拼接json
       for(int i = 0; i<liP.size(); i++){  
           Category c =liP.get(i);
           recursionFn(li, c);
       }
       // 得到json
       String str = modifyStr(returnStr.toString()); 
               
       // 进行转换
       JSONArray jsonObject = JSONArray.fromObject(str);
       try{
            menuString = jsonObject.toString();
       }catch(Exception e){
            menuString = "ss";
       
       // json 返回值
       JsonUtils.write("{\"text\": \".\", \"children\" :"+str+"}");
       return Action.SUCCESS;
   
           
   /**
    * 迭代出某一个Category下所有的
    * @param list
    * @param category
    */
   public void recursionFn(List<Category> list , Category category){ 
       // 有子项目
       if(hasChild(list,category)){
           // 拼接: 项目ID
           returnStr.append("{\"id\": \"");
           returnStr.append(category.getId());
           returnStr.append("\" , ");
           // 拼接: 项目名
           returnStr.append("\"text\": \"Category -- ");
           returnStr.append(category.getName());
           returnStr.append("\"");
           // 拼接: 父节点ID
           returnStr.append(",\"parentId\":");
           if(category.getCategory()!=null){
               returnStr.append("\"");
               returnStr.append(category.getCategory().getId());
               returnStr.append("\"");
           }else{
               returnStr.append("\""); 
               returnStr.append("\"");
           }
           // 拼接: 城市
           returnStr.append(",\"city\":"); 
           returnStr.append("\"");
           returnStr.append("常州");
           returnStr.append("\""); 
           // 拼接: 活动时间
           returnStr.append(",\"activityTime\":"); 
           returnStr.append("\"");
           returnStr.append(StringUtils.join(DateHelper.defaultFormat(category.getBeginDatetime()), " - ", DateHelper.defaultFormat(category.getEndDatetime())));
           returnStr.append("\""); 
           returnStr.append(",\"children\":[");
           // 有Event
           if(hasEvent(category)){
               List<Event> eventList = getEventList(category);
               for(int j = 0;j<eventList.size();j++){
                   // 拼接: eventID
                   Event e = eventList.get(j);
                   if(j==0){
                       returnStr.append("{\"id\": \"");
                   }else {
                       returnStr.append(",{\"id\": \"");
                   }
                   returnStr.append(e.getId());
                   returnStr.append("\" , ");
                   // 拼接:Even名
                   returnStr.append("\"text\": \"Event -- ");
                   returnStr.append(e.getName()); 
                   returnStr.append("\"");
                   // 拼接: 父节点ID
                   returnStr.append(",\"parentId\":"); 
                   returnStr.append("\"");
                   returnStr.append(category.getId());
                   returnStr.append("\""); 
                   // 拼接: Event城市
                   returnStr.append(",\"city\":"); 
                   returnStr.append("\"");
                   returnStr.append("常州");
                   returnStr.append("\""); 
                   // 拼接: Event活动时间
                   returnStr.append(",\"activityTime\":"); 
                   returnStr.append("\"");
                   returnStr.append(StringUtils.join(DateHelper.defaultFormat(e.getBeginDatetime()), " - ", DateHelper.defaultFormat(e.getEndDatetime())));
                   returnStr.append("\""); 
                   returnStr.append(",\"leaf\":true},");
               }
           }
           // 得到子项目,进行递归
           List<Category> childList = getChildList(list,category);
           Iterator it = childList.iterator();
           while(it.hasNext()){
               Category n = (Category)it.next();
               recursionFn(list,n);
           
           returnStr.append("]},");
       else {
           // 没有子项目
           // 拼接: 项目ID
           returnStr.append("{\"id\": \"");
           returnStr.append(category.getId());
           returnStr.append("\" , ");
           // 拼接: 项目名
           returnStr.append("\"text\": \"Category -- ");
           returnStr.append(category.getName()); 
           returnStr.append("\"");
           // 拼接: 父节点ID
           returnStr.append(",\"parentId\": "); 
           if(category.getCategory()!=null){
               returnStr.append("\"");
               returnStr.append(category.getCategory().getId());
               returnStr.append("\"");
           }else{
               returnStr.append("\""); 
               returnStr.append("\"");
           
           // 拼接: 项目城市
           returnStr.append(",\"city\":"); 
           returnStr.append("\"");
           returnStr.append("常州");
           returnStr.append("\""); 
           // 拼接: 项目 活动时间
           returnStr.append(",\"activityTime\":"); 
           returnStr.append("\"");
           returnStr.append(StringUtils.join(DateHelper.defaultFormat(category.getBeginDatetime()), " - ", DateHelper.defaultFormat(category.getEndDatetime())));
           returnStr.append("\""); 
           // 有Event
           if(hasEvent(category)){
               List<Event> eventList = getEventList(category);
               returnStr.append(",children:[");
               for(int j = 0;j<eventList.size();j++){
                   // 拼接: EventID
                   Event e = eventList.get(j);
                   if(j==0){
                       returnStr.append("{\"id\": \"");
                   }else {
                       returnStr.append(",{\"id\": \"");
                   }
                   returnStr.append(e.getId());
                   returnStr.append("\" , ");
                   // 拼接: Event名
                   returnStr.append("\"text\": \"Event -- ");
                   returnStr.append(e.getName()); 
                   returnStr.append("\"");
                   // 拼接: 父节点ID
                   returnStr.append(",\"parentId\":"); 
                   returnStr.append("\"");
                   returnStr.append(category.getId());
                   returnStr.append("\""); 
                   // 拼接: Event城市
                   returnStr.append(",\"city\":"); 
                   returnStr.append("\"");
                   returnStr.append("常州");
                   returnStr.append("\""); 
                   // 拼接: Event活动时间
                   returnStr.append(",\"activityTime\":"); 
                   returnStr.append("\"");
                   returnStr.append(StringUtils.join(DateHelper.defaultFormat(e.getBeginDatetime()), " - ", DateHelper.defaultFormat(e.getEndDatetime())));
                   returnStr.append("\""); 
                   returnStr.append(",\"leaf\":true},");
               }
               returnStr.append("]},");
           else {
               returnStr.append(",\"leaf\":true},");
           }
       }
   }  
           
   /**
    *  判断是否有子节点
    * @param list
    * @param category
    * @return
    */
   public boolean hasChild(List<Category> list, Category category){ 
       //判断是否有子节点
       return getChildList(list,category).size()>0?true:false;
   }
           
   /**
    * 判断是否有Event
    * @param list
    * @param category
    * @return
    */
   public boolean hasEvent(Category category){ 
       //判断是否有子节点 
       List<Event > items =getEventList(category);
               
       if(items.size()>0){
           return true;
       else {
           return false;
       }
   
           
   /**
    * 修饰一下才能满足Extjs的Json格式            
    * @param returnStr
    * @return
    */
   public String modifyStr(String returnStr){
       //修饰一下才能满足Extjs的Json格式            
       return ("["+returnStr+"]").replaceAll(",]""]").replaceAll(",,",",");
   }
   /**
    * 得到子节点列表
    * @param list
    * @param category
    * @return
    */
   public List<Category> getChildList(List<Category> list , Category category){
       //得到子节点列表
       List<Category> li = new ArrayList<Category>();  
               
       for(int i=0;i<list.size();i++){
           Category n = list.get(i);  
           if(n.getCategory()!=null){
               if(n.getCategory().getId()==category.getId()){ 
                   li.add(n);
               
           
       
       return li;
   
           
   /**
    * 得到Event列表 
    * @param category
    * @return
    */
   public List<Event> getEventList(Category category){
       //得到子节点列表
       List<Event> li = new ArrayList<Event>();  
       //判断是否有子节点
       EventDto eventDto = new EventDto();
       Category cg = new Category();
       cg.setId(category.getId()); 
       eventDto.setCategory(cg);
       eventDto.setFlg(DeleteStatus.NORMAL);
       List<EventDto> items = eventService.searchItems(eventDto);
       for(int i =0;i<items.size();i++){
           EventDto dto = items.get(i);
           Event e = dto.getEvent();
           if(e.getReleaseStatus().equals(ReleaseStatus.PUBLIC)){
               li.add(e);
           
       }
       return li;
   }




下面贴出treegrid.json里面的json格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
{
    "text"".",
    "children": [
        {
            "task""Project: Shopping",
            "duration"13.25,
            "user""Tommy Maintz",
            "iconCls""task-folder",
            "expanded"true,
            "children": [
                {
                    "task""Housewares",
                    "duration"1.25,
                    "user""Tommy Maintz",
                    "iconCls""task-folder",
                    "children": [
                        {
                            "task""Kitchen supplies",
                            "duration"0.25,
                            "user""Tommy Maintz",
                            "leaf"true,
                            "iconCls""task"
                        }, {
                            "task""Groceries",
                            "duration": .4,
                            "user""Tommy Maintz",
                            "leaf"true,
                            "iconCls""task",
                            "done"true
                        }, {
                            "task""Cleaning supplies",
                            "duration": .4,
                            "user""Tommy Maintz",
                            "leaf"true,
                            "iconCls""task"
                        }, {
                            "task""Office supplies",
                            "duration": .2,
                            "user""Tommy Maintz",
                            "leaf"true,
                            "iconCls""task"
                        }
                    ]
                }, {
                    "task""Remodeling",
                    "duration"12,
                    "user""Tommy Maintz",
                    "iconCls""task-folder",
                    "expanded"true,
                    "children": [
                        {
                            "task""Retile kitchen",
                            "duration"6.5,
                            "user""Tommy Maintz",
                            "leaf"true,
                            "iconCls""task"
                        }, {
                            "task""Paint bedroom",
                            "duration"2.75,
                            "user""Tommy Maintz",
                            "iconCls""task-folder",
                            "children": [
                                {
                                    "task""Ceiling",
                                    "duration"1.25,
                                    "user""Tommy Maintz",
                                    "iconCls""task",
                                    "leaf"true
                                }, {
                                    "task""Walls",
                                    "duration"1.5,
                                    "user""Tommy Maintz",
                                    "iconCls""task",
                                    "leaf"true
                                }
                            ]
                        }, {
                            "task""Decorate living room",
                            "duration"2.75,
                            "user""Tommy Maintz",
                            "leaf"true,
                            "iconCls""task",
                            "done"true
                        }, {
                            "task""Fix lights",
                            "duration": .75,
                            "user""Tommy Maintz",
                            "leaf"true,
                            "iconCls""task",
                            "done"true
                        }, {
                            "task""Reattach screen door",
                            "duration"2,
                            "user""Tommy Maintz",
                            "leaf"true,
                            "iconCls""task"
                        }
                    ]
                }
            ]
        }, {
            "task""Project: Testing",
            "duration"2,
            "user""Core Team",
            "iconCls""task-folder",
            "children": [
                {
                    "task""Mac OSX",
                    "duration"0.75,
                    "user""Tommy Maintz",
                    "iconCls""task-folder",
                    "children": [
                        {
                            "task""FireFox",
                            "duration"0.25,
                            "user""Tommy Maintz",
                            "iconCls""task",
                            "leaf"true
                        }, {
                            "task""Safari",
                            "duration"0.25,
                            "user""Tommy Maintz",
                            "iconCls""task",
                            "leaf"true
                        }, {
                            "task""Chrome",
                            "duration"0.25,
                            "user""Tommy Maintz",
                            "iconCls""task",
                            "leaf"true
                        }
                    ]
                }, {
                    "task""Windows",
                    "duration"3.75,
                    "user""Darrell Meyer",
                    "iconCls""task-folder",
                    "children": [
                        {
                            "task""FireFox",
                            "duration"0.25,
                            "user""Darrell Meyer",
                            "iconCls""task",
                            "leaf"true
                        }, {
                            "task""Safari",
                            "duration"0.25,
                            "user""Darrell Meyer",
                            "iconCls""task",
                            "leaf"true
                        }, {
                            "task""Chrome",
                            "duration"0.25,
                            "user""Darrell Meyer",
                            "iconCls""task",
                            "leaf"true
                        }, {
                            "task""Internet Exploder",
                            "duration"3,
                            "user""Darrell Meyer",
                            "iconCls""task",
                            "leaf"true
                        }
                    ]
                }, {
                    "task""Linux",
                    "duration"0.5,
                    "user""Aaron Conran",
                    "iconCls""task-folder",
                    "children": [
                        {
                            "task""FireFox",
                            "duration"0.25,
                            "user""Aaron Conran",
                            "iconCls""task",
                            "leaf"true
                        }, {
                            "task""Chrome",
                            "duration"0.25,
                            "user""Aaron Conran",
                            "iconCls""task",
                            "leaf"true
                        }
                    ]
                }
            ]
        }
    ]
}

对比一下,就会发现


后台拼接json的代码------其中最关键的代码:

JsonUtils.write("{\"text\": \".\", \"children\" :"+str+"}");

是的,json数据前面必须加上  "{\"text\": \".\", \"children\" :"  ,之前一直不知道,所以一直无法显示啊。


extjs4.2前台代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Category/Event查询model
     Ext.define('Task', {
         extend: 'Ext.data.Model',
         fields: [
             {name: 'text',     type: 'string'},// 列数据定义:Category名/Event名
             {name: 'activityTime',     type: 'string'},// 列数据定义:活动时间
             {name: 'id', type: 'string'},// 列数据定义:CategoryID/EventID
             {name: 'city', type: 'string'}// 列数据定义:城市
         ]
     });
    
     // Category/Event查询Store
     var store = Ext.create('Ext.data.TreeStore', {
         model: 'Task',
         proxy: {
             type: 'ajax',
             url: 'release!releaseSearch'
         },
         sorters: [{   
             property: 'leaf',   
             direction: 'ASC' 
         }, {   
             property: 'text',   
             direction: 'ASC' 
         }],
         folderSort: true
     });
    
     // Category/Event查询结果
     var tree = Ext.create('Ext.tree.Panel', {
         width: 500,
         height: 300,
         collapsible: true,
         useArrows: true,
         rootVisible: false,
         store: store,
         multiSelect: true,
         columns: [{// Category名/Event名
             xtype: 'treecolumn'
             text: Res.ReleaseEvent.NAME,
             width: 400,
             sortable: true,
             dataIndex: 'text',
             locked: true
         }, {// 活动时间
             text: Res.ReleaseEvent.ACTIVITY_TIME,
             width: 200,
             dataIndex: 'activityTime',
             align: 'center',
             sortable: true
         }, {// 城市
             text: Res.ReleaseEvent.CITY,
             width: 200,
             dataIndex: 'city',
             align: 'center',
             sortable: true
         }]
     });
0 1
原创粉丝点击