simplehumn 发表于 2013-1-28 09:43:58

Ext.Toolbar异步加载菜单

09年用Ext2.2.1,做了个Ext.Toolbar菜单,前几天又涉及到这样的菜单(Ext3.3.1),于是把原来的代码拷贝过来,居然还能用,在这里备份一下。
在网上也找过Ext.Toolbar异步加载的资料,说的不太详细,有些我看不太懂,但确实有menuStore这类的东西,后台动态加载,参考网址http://www.sencha.com/forum/showthread.php?70436-Toolbar-or-Menu-with-Json-items
http://www.lubber.de/extjs/storemenu/
不过我没看懂怎么用http://www.agoit.com/images/smiles/icon_cry.gif
以下是我自己写的一个循环,能在3层或3层菜单以内起作用,只需把对象属性换成自己的对象属性就行了。
JSP代码,需要引用java.util.List,和自己的menu对象类
<%@ page contentType="text/html; charset=UTF-8"%> <% String path = request.getContextPath(); %> <%@ page import="com.xxx.xxx.model.*,java.util.*" %>
以下是菜单for循环
<%//菜单树List mList = (List)request.getAttribute("menuList");Object[] obj = mList.toArray();String menuStr = "'-'";//开始的分隔符boolean flag = false;boolean flag2 = false;int StrLength = 0;//定义子菜单头部字符串的长度,用来加{},{}之间的逗号int StrLength2 = 0;//定义子菜单2头部字符串的长度,用来加{},{}之间的逗号for(int i=0;i<obj.length;i++){MenuInfo menu1 = new MenuInfo();menu1 = (MenuInfo)obj;if(menu1.getMenuParentId().equals("rooto")){//第一层,导航栏上的显示菜单menuStr += ",{";menuStr += "text:'";menuStr += menu1.getMenuName();menuStr += "'";String menuStr2 = "";//定义一个字符串,接收第二层——下拉菜单String pid=menu1.getMenuParentId();flag = false;for(int j=0;j<obj.length;j++){MenuInfo menu2 = new MenuInfo();menu2 = (MenuInfo)obj;if(menu2.getMenuParentId().equals(menu1.getMenuId())){if(menuStr2.length()==0){//new一个menumenuStr2 += ",menu:new Ext.menu.Menu({items:[";StrLength = menuStr2.length();}if(menuStr2.length()> StrLength){menuStr2 += ",";}menuStr2 += "{text:'";menuStr2 += menu2.getMenuName();menuStr2 += "'";String menuUrl2 = "";//加第二层菜单的listenerif(menu2.getRptName()!=null && !menu2.getRptName().equals("null") && menu2.getRptNamecn()!=null && !menu2.getRptNamecn().equals("null")){//if(menu2.getMenuUrl()!=null && !menu2.getMenuUrl().equals("null")){menuUrl2 = menu2.getRptName() + "_" + menu2.getRptNamecn();menuStr2 += ",listeners:{ 'click':function(node, event) { event.stopEvent(); var n = tab.getComponent(node.id);";menuStr2 += "if (!n) {    n = tab.add({ 'id':node.id, 'title':node.text, ";menuStr2 += "closable:true, html:'<iframe scrolling=\"auto\" frameborder=\"0\" width=\"100%\" height=\"100%\" ";//menuStr2 += path + menu2.getMenuUrl();menuStr2 += "src=\""+ path +"/login/reportview.htmw?reportnameframe=" + menu2.getRptName() +"&rptName=" + menuUrl2 +"&rcType="+ menu2.getRcType() +"&reportenname="+ menu2.getRptNamecn()+"\" ></iframe>' });   }   tab.setActiveTab(n);}}";}//第三层(开始)String menuStr3 = "";//定义一个字符串,接收第三层菜单String pid2=menu1.getMenuParentId();flag2 = false;for(int k=0;k<obj.length;k++){MenuInfo menu3 = new MenuInfo();menu3 = (MenuInfo)obj;if(menu3.getMenuParentId().equals(menu2.getMenuId())){if(menuStr3.length()==0){//new一个menumenuStr3 += ",menu:new Ext.menu.Menu({ items:[";StrLength2 = menuStr3.length();}if(menuStr3.length()> StrLength2){menuStr3 += ",";}menuStr3 += "{text:'";menuStr3 += menu3.getMenuName();menuStr3 += "'";String menuUrl3 = "";//加第三层(最后一层)菜单的listenerif(menu3.getRptName()!=null && !menu3.getRptName().equals("null") && menu3.getRptNamecn()!=null && !menu3.getRptNamecn().equals("null")){//if(menu3.getMenuUrl()!=null && !menu3.getMenuUrl().equals("null")){menuUrl3 = menu3.getRptName() + "_" + menu3.getRptNamecn();menuStr3 += ",listeners:{ 'click':function(node, event) { event.stopEvent(); var n = tab.getComponent(node.id);";menuStr3 += "if (!n) {    n = tab.add({ 'id':node.id, 'title':node.text, ";menuStr3 += "closable:true, html:'<iframe scrolling=\"auto\" frameborder=\"0\" width=\"100%\" height=\"100%\" ";menuStr3 += "src=\""+ path +"/login/reportview.htmw?reportnameframe=" + menu3.getRptName() +"&rptName=" + menuUrl3 +"&rcType="+ menu3.getRcType() +"&reportenname="+ menu3.getRptNamecn()+"\" ></iframe>' });   }   tab.setActiveTab(n);}}";}/**这一块留下来等待菜单扩展*/menuStr3 += "}";flag2 = true;}}if(flag2==true && !pid2.equals(menu2.getMenuId())){//如果有子节点并且循环到列表的最后一行也加]}),然后跳出menuStr3 += "]})";}menuStr2 += menuStr3;//第三层(结束)menuStr2 += "}";flag = true;}}if(flag==true && !pid.equals(menu1.getMenuId())){menuStr2 += "]})";}menuStr += menuStr2;menuStr += "},'-'";}}%>
以下为JS代码,当然要在JSP文件里面有这个renderTo的标签<div id="toolbar"></div>,或者按照自己的需要写。
<script type="text/javascript">Ext.onReady(function(){var tb = new Ext.Toolbar();tb.render('toolbar');tb.add(<%=menuStr %>);tb.doLayout();});</script>
后台java代码,其实只需要把对象的属性封装好直接仍出来,前台能拿到对象的属性(菜单名称、url等)就行
this.getRequest().setAttribute("menuList", ls);
ls为List<Object>集合
页: [1]
查看完整版本: Ext.Toolbar异步加载菜单