功能java
在頁面增長"名稱"和"狀態"兩個搜索框,經過搜索條件來過濾tree的顯示列表node
原先的作法:ajax
//經過在tree的url中添加請求參數,而後在Action接受請求參數並過濾結果集 $('#tree').tree('options').url ='./iface/findCustomerTree?customerName='+searchValue+"&object.state="+$('#questionState').combobox('getValue'); $('#tree').tree('reload');
這麼作的話:由於名稱可能會是中文,這樣直接附加在請求url中,struts2的過濾器不會對GET請求起做用.因此可能會出現亂碼服務器
改正後的寫法:框架
//經過添加請求參數,把請求參數封裝成一個object對象,這種寫法是POST請求,POST請求會被struts2的filter攔截 $('#tree').tree('options').url = './iface/findCustomerTree'; $('#tree').tree('load',{"customerName":searchValue,"object.state":$('#questionState').combobox('getValue')});
若是是datagrid,能夠這麼寫:post
var data = {}; data["customerName"] = searchValue; data["object.state"] = $('#questionState').combobox('getValue'); $.ajax({ url:'./iface/findCustomerTree', data:data, type:'post', success:function(data){ console.info(data); $('#tree').tree('loadData',data); } });
如今出現了新的問題:ui
由於項目中須要作多層樹,樹的結構爲:首層爲customer;第二層爲customer下的用戶列表;第三層爲該用戶下的問題列表,因而這麼作:url
$("#tree").tree({ onBeforeExpand:function(node){ if(node.attributes && node.attributes.customerId){ $('#tree').tree('options').url = "./iface/findUserTree?customerId=" + node.id+"&object.state="+$('#questionState').combobox('getValue'); //若是attributes存在屬性user,則表示展開的是用戶user,那麼須要查找的是該user下面的userfeedback提交的問題 }else if(node.attributes && node.attributes.userId){ $('#tree').tree('options').url = "./iface/findUserQuestions?loginId=" + node.id+"&object.state="+$('#questionState').combobox('getValue'); //若是存在url屬性,則表示右側的tab頁將要被填充(此時樹節點爲最末級的葉子節點,已是open) }else if(node.attributes && node.attributes.url){ //啥都不須要作 } }, });
上面的寫法是經過當前節點的屬性來判斷,當前被操做的節點是一級,二級,仍是三級節點,這麼作以後產生了一個很奇怪的問題:
code
咱們知道tree節點被展開的時候,會自動向服務器發送一個id的請求參數,這個是easyui的tree框架自動作的事情,而咱們在展開一級和二級節點的時候,在tree的請求url後面添加了請求參數,在JS中能夠看到該請求其實是POST請求,可是url中的請求參數也可以被sturts2獲取到.注意:***而若是在這以前,tree執行了tree('load',queryParams),那麼就會在tree的options屬性中把這queryParams對象中的內容添加到options中,而後再展開樹的時候,該請求參數queryParams會做爲tree的一個屬性構成,即此時請求URL中附加了請求參數(經過?在請求後面加的參數),而後在POST請求中的內容FromData:id和queryParams,如圖:對象
這種方式的請求Action接受不到...我不知道是什麼緣由,後面只有把請求參數queryParams這個對象清空,即在onBeforeExpand方法中直接寫上了:$('#tree').tree('options').queryParams = {};,接下來的代碼和上面的同樣:
$('#tree').tree('options').queryParams = {}; if(node.attributes && node.attributes.customerId){...}...