1. 程式人生 > >EXTJS5的學習記錄之TreePanel樹的本地載入與非同步載入

EXTJS5的學習記錄之TreePanel樹的本地載入與非同步載入

  首先來建立一個store資料來源

var store = Ext.create('Ext.data.TreeStore', {
		    root: {
		        expanded: false,//預設不展開
		        children: [   //這裡是樹的節點 有層級的
		            { text: "一級節點", leaf: true,id:'firstNode',checked:false },
		            { text: "一級節點1", expanded: true,checked:false, children: [
		                { text: "二級節點", leaf: true,checked:false },
		                { text: "二級節點1", leaf: true,checked:false}
		            ] },
		            { text: "無限載入子節點", leaf: false,checked:false } //leaf:false表示有下級節點
		        ]
		    }
		});

 接下來建立tree物件 

return Ext.create('Ext.tree.Panel', {    //此處我是在方法中return 的 如需直接渲染的朋友 應使用renderTo
		    title: 'Simple Tree',
		    id:'tree',
		    width: 500,
		    height: 350,
		    store: store,
		    autoEncode: true, //提交時是否自動編碼 
		    //selModel: new Ext.tree.MultiSelectionModel(), // 支援多選的選擇模型 
		    rootVisible: false,
		    listeners:{
		    	beforeitemexpand:function(node,optd){  //展開節點之前觸發
		    		var tt=node.data.text;
		    		store.setProxy({   //非同步從伺服器上載入資料  extjs會自動幫我們解析
                           type:'ajax',
                           url:'SyncTreeServlet' ,
                           extraParams:{time:tt}   //額外引數
                     });
		    	}
		    },
			bbar: [{      //剩下的 按鈕功能都是無關緊要的了
				text: "向上按鈕",    
				tooltip: "向上選擇一個節點",    
				tooltipType: "qtip",    
				handler: function(){     
					var model = Ext.getCmp("tree").getSelectionModel();//獲取選擇模型     
					model.selectPrevious();    
				}   
			},{
				text: "向下按鈕",    
				tooltip: "向下選擇一個節點",    
				tooltipType: "qtip",    
				handler: function(){     
					var model = Ext.getCmp("tree").getSelectionModel();//獲取選擇模型     
					model.selectNext();    
				} 
			},{
				text: "獲取值",    
				tooltip: "獲取被選節點的值",    
				tooltipType: "qtip",    
				handler: function(){     
					var model = Ext.getCmp("tree").getSelectionModel();//獲取選擇模型     
					var selectedNode = model.getSelection();//獲取選擇的節點    
					console.info(selectedNode);
					if(selectedNode&&selectedNode.length>0){      
						Ext.MessageBox.alert("hint", selectedNode[0].data.text); 
					}     
				} 
			}],
			tbar:[{
				text: "新增節點",    
				tooltip: "新增樹節點",    
				tooltipType: "qtip",    
				handler: function(){  
					Ext.MessageBox.prompt("輸入", "請輸入新節點的名稱:", function(btn, txt){   
						if(btn == "ok"){    
							var tree = Ext.getCmp("tree");
							var newNode = new Ext.tree.Panel({text: txt,leaf: true});    
							var selNode = tree.getSelectionModel().getSelection();    
							if(selNode&&selNode.length>0){     
								//Ext.Msg.alert("錯誤", "在新增新節點之前請先選擇參照節點!"); 
								selNode[0].appendChild(newNode);
								tree.getSelectionModel().clearSelections(); //清除所有選擇節點 如不清楚 即使刪除所有節點 獲取選中節點時依舊會有一行選中資料
							}else{  
								tree.getRootNode().appendChild(newNode);
								tree.getSelectionModel().clearSelections(); //清除所有選擇節點
							}  
						}  
					});
				}
			},{
				text: "刪除節點",    
				tooltip: "刪除選擇的樹節點",    
				tooltipType: "qtip",    
				handler: function(){     
					var tree = Ext.getCmp("tree");
					var selNode = tree.getSelectionModel().getSelection();    
					if(!selNode||selNode.length<1){     
						Ext.Msg.alert("錯誤", "請選擇一個節點!"); 
					}else{  
						selNode[0].remove();
						tree.getSelectionModel().clearSelections(); //清除所有選擇節點
					}  
				}
			},{
				text: "修改節點",    
				tooltip: "修改選擇的樹節點",    
				tooltipType: "qtip",    
				handler: function(){     
					var tree = Ext.getCmp("tree");
					var selNode = tree.getSelectionModel().getSelection();    
					if(!selNode||selNode.length<1){     
						Ext.Msg.alert("錯誤", "請選擇一個節點!"); 
					}else{  
						Ext.MessageBox.prompt("輸入", "請輸入節點的新名稱:", function(btn, txt){ 
							if(btn=="ok"){
								selNode[0].set("text",txt);
								selNode.updateInfo(true);
								Ext.Msg.alert("hint","修改完成!");
								tree.getSelectionModel().clearSelections(); //清除所有選擇節點
							}
						
						});
					}  
				}
			}],
		    renderTo: Ext.getBody()
		});

最後 放上 伺服器返回的json資料格式
public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		Writer out = response.getWriter();
		StringBuffer sb = new StringBuffer("[");
		for (int i = 0; i < 4; i++) {
			int id = (int) (Math.random()*100000);
			//System.out.println("id:=================>"+id);
			sb.append("{id:"+id+",text:'非同步節點"+i+"',leaf: false,checked:false},");
		}
		sb.append("]");
		out.write(sb.toString());
	}
 

最後結果如圖: