dojoでのtree更新に関する質問
前の段階でdojoの中のtreeをやっているのは問題を発見して、私がtreeのstoreをページの上でtreeのコントロールの中で死んで、私がtreeを更新してページをリフレッシュした時、treeは変化していません
コードから、treeのデータソースは、initAccountTreeActionで返されるデータをカスタマイズすることによって得られ、このActionコードは次のようになります.
responseによってページに動的に書き込まれていることがわかります.treeのstoreは、動的にtreeを変更するたびに(例えば、削除サブノードを増やす)、ページに直接更新されずにロードされます.
仕方なくtreeを研究した後、treeの動的作成にdojo異部呼び出し関数dojoを加えることに気づいた.xhrGetはこの更新されない問題を解決することができ、具体的なコードは以下の通りである.
もちろんページでもtreeコントロールを定義する必要がありますが、簡単にdivを設定すればいいので、具体的なTreeのフォーマットの問題はDemoのtestフォルダのtree storeフォーマットに関する資料を参照してください.
<div dojoType="dojo.data.JsonItemStore" jsId="account"
url="/Fiscal/initAccountTreeAction.action"></div>
<div dojoType="dijit.Tree" id=tree store="account" query="{type:'continent'}"
labelAttr="name" typeAttr="type"></div>
コードから、treeのデータソースは、initAccountTreeActionで返されるデータをカスタマイズすることによって得られ、このActionコードは次のようになります.
package com.sanfang.fiscal.action.account;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanfang.fiscal.business.interfaces.IBusinessDelegate;
import com.sanfang.fiscal.util.AjaxUtil;
public class AccountTreeAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private IBusinessDelegate businessDelegate;
private String mark;
private AjaxUtil ajaxUtil;
public String getMark() {
return mark;
}
public void setMark(String mark) {
this.mark = mark;
}
public AjaxUtil getAjaxUtil() {
return ajaxUtil;
}
public void setAjaxUtil(AjaxUtil ajaxUtil) {
this.ajaxUtil = ajaxUtil;
}
public IBusinessDelegate getBusinessDelegate() {
return businessDelegate;
}
public void setBusinessDelegate(IBusinessDelegate businessDelegate) {
this.businessDelegate = businessDelegate;
}
public String initAccountTree() throws IOException{
Map session = ActionContext.getContext().getSession();
ServletActionContext.getResponse().setContentType("text/json; charset=UTF-8");
String language = (String)session.get("language");
String fiscalSetID = (String)session.get("fiscalSetID");
List<String> accountSetList = new ArrayList<String>();
if("all".equals(mark)){
accountSetList = businessDelegate.findAccountSetIDIsUsedByFiscalSetID(fiscalSetID, null, null);
}else if("isSettleAcct".equals(mark)){
accountSetList = businessDelegate.findAccountSetIDIsUsedByFiscalSetID(fiscalSetID, true, null);
}else if("isUserObjAcct".equals(mark)){
accountSetList = businessDelegate.findAccountSetIDIsUsedByFiscalSetID(fiscalSetID, null, true);
}
String result = ajaxUtil.AccountListToTreeJSON(language, fiscalSetID, accountSetList);
ServletActionContext.getResponse().getWriter().write(result);
return null;
}
}
responseによってページに動的に書き込まれていることがわかります.treeのstoreは、動的にtreeを変更するたびに(例えば、削除サブノードを増やす)、ページに直接更新されずにロードされます.
仕方なくtreeを研究した後、treeの動的作成にdojo異部呼び出し関数dojoを加えることに気づいた.xhrGetはこの更新されない問題を解決することができ、具体的なコードは以下の通りである.
// tree store
function strToObj(json){
return eval("("+json+")");
}
function init(response){
// tree store
var data = strToObj(response);
// store
var store1 = new dojo.data.ItemFileReadStore({data:data});
// tree, tree , tree
var _tree=new dijit.Tree({
label:"Accounting",
store:store1,
query:{type:'continent'},
labelAttr:"name",
typeAttr:"type",
preventCache:true
},
dojo.byId('tree'));
dojo.subscribe("tree", null, treeHandler);
}
function test(){
// , tree store
dojo.xhrGet({
url: '/Fiscal/initAccountTreeAction.action',
method: 'POST',
load: function(response, ioArgs) {
// resonse Action
init(response);
},
preventCache: true,
content: {mark:'all'}
});
}
// test
dojo.addOnLoad(test);
もちろんページでもtreeコントロールを定義する必要がありますが、簡単にdivを設定すればいいので、具体的なTreeのフォーマットの問題はDemoのtestフォルダのtree storeフォーマットに関する資料を参照してください.
<div id="tree"></div>