在系统中导航用layout:accordionLayout 布局,每个layout:panel根据用户权限动态生成,layout:panel下动态添加w:tree组件,那么可以用如下方法,对每个layout:panel底下的w:tree动态添绑定同一个事件监听处理方法,代码如下:
/**
* 在页面展示前,根据用户的功能权限,动态生成功能模块的树结构
*
* @param isPostback
*/
@BeforeRender
public void beforeRender(boolean isPostback) {
//
if (isPostback) {
return;
}
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
// 1、根据用户的功能模块权限,查找属于用户的功能模块信息
HttpSession session = (HttpSession) context.getExternalContext()
.getSession(true);
// 用户登录信息
LoginInfo loginInfo = (LoginInfo) session
.getAttribute(Global.LOGIN_INFO);
// 2、循环功能模块信息列表,动态构建功能模块及操作模块
List<XtGnmk> gnmkList = mainService.getGnmkList(loginInfo);
// 循环功能模块列表,动态生成树结构
int i = 0;
for (XtGnmk gnmk : gnmkList) {
// 只对第一级的节点处理
if (gnmk.getMkBh().length() == 2) {
// 新建功能模块的抽屉标签
UIPanel panel = (UIPanel) app
.createComponent(UIPanel.COMPONENT_TYPE);
panel.setTitle(gnmk.getMkMc());
panel.setBorder(false);
panel.setCollapsed(true);
// 给功能模块抽屉下添加功能模块树
UITree tree = (UITree) app
.createComponent(UITree.COMPONENT_TYPE);
tree.setValue(new XtGnmkTreeDataProvider(gnmk));
tree.setId("tree" + i);
tree.setRootVisible(false);
tree.setExpandAll(true);
// 为树结构添加点击事件的监听
tree.getAjaxEventHandler().addElBinding("onclick",
"#{mainBean.tree_onclick}", false);
// 将生成的Tree添加到对应的抽屉下
panel.getChildren().add(tree);
// 将抽屉添加到功能导航LayoutPanel中
layout.getChildren().add(panel);
i++;
}
}
}
/**
* 为树添加事件的监听,执行页面的专项操作
*
* @param event
*/
public void tree_onclick(TreeNodeEvent event) {
// 根据事件对象,得到事件的Node
UITreeNode node = event.getEventNode();
// 得到节点中的功能模块对像
XtGnmk gnmk = (XtGnmk) node.getUserData();
// 得到功能模块连接的url
String url = gnmk.getUrl();
// 激活contentLayout中的第二个Tab,即工作区的Panel
content.setActiveTab(1);
// 设置工作区的Frame的URL,执行页面的转向
workPanelFrame.load(url);
}