[英]Primefaces / JSF: selectOneMenu value is not set, ajax listener not called
[英]Setting primefaces selectOneMenu default value from primefaces tree selected item in jsf with ajax
在第一种形式中,我有一个primefaces多重选择树(从LDAP填充),而在另一种形式中,我有一个selectOneMenu primefaces组件。 我想将默认的selectOneMenu值(此菜单上第一个显示)作为树选择节点的值。 我尝试过使用f:ajax ..但它不起作用,因为这些元素不属于同一形式(render属性中的selectOneMenu名称是未知的。)
这是我的index.xhtml,其中包含所有这些元素:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
<script src="JS/general.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="CSS/general.css" />
<script src="clean/clean-ajax-all.js"></script>
<script>
var crudmenu = "crudmenu";
var adduserform = "adduserform";
</script>
</h:head>
<body>
<h:form id="form">
<p:growl id="messages" showDetail="true" escape="false" />
<p:tree value="#{treeBean.root}" var="node"
onNodeClick="this.form.submit();" selectionMode="multiple"
selection="#{treeBean.selectedNodes}" id="treeMultiple">
<p:treeNode>
<h:outputText value="#{node}" />
</p:treeNode>
</p:tree>
<p:commandButton value="Display Selected" update="messages"
actionListener="#{treeBean.displaySelectedMultiple}" id="btnDisplay" rendered="false"/>
</h:form>
<div id="adduserform" name="adduserform"
style="text-align: center; overflow: hidden; height: 0px; width: 270px; border: #040600 1px;">
<h:form>
<h:panelGrid border="1" columns="2">
ID : <p:selectOneMenu value="" panelStyle="width:150px"
effect="fade" var="p" style="width:160px" filter="true"
filterMatchMode="startsWith">
<f:selectItem itemLabel="#{treeBean.selectedNodeValue}"
itemValue="" />
</p:selectOneMenu>
objectClass : <p:selectOneMenu value="" panelStyle="width:150px"
effect="fade" var="p" style="width:160px" filter="true"
filterMatchMode="startsWith">
<f:selectItem itemLabel="Select One" itemValue="" />
</p:selectOneMenu>
</h:panelGrid>
</h:form>
</div>
</body>
</html>
这是我的托管bean:
package org.primefaces.examples.view;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
//other imports..
@ManagedBean(name = "treeBean")
public class TreeBean implements Serializable {
private TreeNode root;
private TreeNode[] selectedNodes;
private String selectedNodeValue;
public TreeBean() {
populateTreeFromLdap();
}
public String getSelectedNodeValue() {
if (selectedNodes != null && selectedNodes.length == 1)
for (TreeNode node : selectedNodes)
selectedNodeValue = node.getData().toString();
return selectedNodeValue;
}
public void setSelectedNodeValue(String selectedNodeValue) {
this.selectedNodeValue = selectedNodeValue;
}
public void populateTreeFromLdap(){
//code to get entries from LDAP..
}
}
public TreeNode getRoot() {
return root;
}
public TreeNode[] getSelectedNodes() {
return selectedNodes;
}
public void setSelectedNodes(TreeNode[] selectedNodes) {
this.selectedNodes = selectedNodes;
}
public void displaySelectedMultiple(ActionEvent event) {
if (selectedNodes != null && selectedNodes.length > 0) {
StringBuilder builder = new StringBuilder();
for (TreeNode node : selectedNodes) {
builder.append(node.getData().toString());
builder.append("<br />");
}
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
"Selected", builder.toString());
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
}
问题是在发生树节点选择后如何刷新selectOneMenu的itemLabel的“#{treeBean.selectedNodeValue}”。
顺便说一句,jsf中的即时消息是新的,并且让我感到不高兴的是,传统的ajax用于从另一个页面的div加载内容的方法在jsf中不再起作用。
thnx寻求帮助!
如果我了解您要执行的操作,则接下来将selectOneMenu绑定到备用Bean上的值。 在您的getSelectedNodeValue()中,我将设置该值。 完成这项工作的最后一步是使用一个监听器事件,如下所示:primefaces.org/showcase-labs/ui/treeEvents.jsf。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.