前阶段在搞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后(比如增加删除子节点),tree的store并没有直接在页面中重新更新加载进来。
没办法,只能在去研究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>
相关资源:敏捷开发V1.0.pptx
