在基于JSF-Primefaces的liferay portlet(PrimeFaces 6.1)上,我在<p:tree>
内选择元素时尝试执行自定义任务。为此,我根据PF文档所述的内容,在我的支持Bean上使用PF ajax功能和监听器方法。
自定义树按预期显示,但是当我点击<p:treeNode>
元素时没有任何反应。
xhtml方:
<h:form id="form">
<p:growl id="messages" showDetail="true" />
<p:tree id="entityTree" value="#{bean.entityTree}" var="node" animate="true" selectionMode="single" selection="#{bean.selectedNode}">
<p:ajax event="select" update=":form:messages" listener="#{bean.onNodeSelect}" />
<p:ajax event="expand" update=":form:messages" listener="#{bean.onNodeExpand}" />
<p:ajax event="collapse" update=":form:messages" listener="#{bean.onNodeCollapse}" />
<p:treeNode>
<h:outputText value="#{node}" />
</p:treeNode>
<p:treeNode type="type-0">
<h:outputText value="#{node}" />
</p:treeNode>
<p:treeNode type="type-1">
<h:outputText value="#{node}" />
</p:treeNode>
</p:tree>
</h:form>
Bean方面:
@ManagedBean(name = "bean")
@ViewScoped
public class Bean implements Serializable {
private static Logger logger = Logger.getLogger(BEntityTree.class);
private TreeNode entityTree;
private TreeNode selectedNode;
public BEntityTree() {
// irrelevant
}
@PostConstruct
private void onPostConstruct() {
logger.trace("start");
//create tree
TreeNode aux, aux2;
this.entityTree = new DefaultTreeNode("root", null);
aux = new DefaultTreeNode("type-0", "nodo 1", this.entityTree);
aux2 = new DefaultTreeNode("type-1", "nodo 1.1", aux);
}
// this.entityTree's getter-setter
// this.selectedNode's getter-setter;
public void onNodeSelect(NodeSelectEvent event) {
logger.trace("start");
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
"Selected", event.getTreeNode().toString());
FacesContext.getCurrentInstance().addMessage(null, message);
}
public void onNodeExpand(NodeExpandEvent event) {
//...
}
public void onNodeCollapse(NodeCollapseEvent event) {
//...
}
}
我做错了什么?为什么在选择节点时甚至不调用onNodeSelect()
侦听器?