dojoでのtree更新に関する質問


前の段階でdojoの中のtreeをやっているのは問題を発見して、私がtreeのstoreをページの上でtreeのコントロールの中で死んで、私がtreeを更新してページをリフレッシュした時、treeは変化していません
<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>