[英]jsf ajax conditional rendering not working
我有帶有選擇項“ D”和“ F”的selectonemenu表單,我想渲染其他元素,例如h:outputtext和h:inputtext,當選擇“ D”時,在選擇“ F”時隱藏它們,我已經遵循了這個問題,並嘗試使它與我的情況相同,但是由於某種原因,頁面對seleconemenu中的選擇更改沒有反應
我的view.xhtml:
<!DOCTYPE html>
<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:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j">
<h:head>
<meta charset="utf-8" />
<title>New item</title>
<link rel="stylesheet" href="style.css" />
</h:head>
<h:body>
<div id="wrapper">
<header>
<ul>
<li><h:outputLink value="index.xhtml">main</h:outputLink></li>
<li><h:outputLink value="reservations.xhtml">reservations</h:outputLink></li>
<li><h:outputLink value="items.xhtml">items</h:outputLink></li>
<li><h:outputLink value="revenue.xhtml">revenue</h:outputLink></li>
<li><h:outputLink value="statistics.xhtml">statistics</h:outputLink></li>
</ul>
</header>
<div id="content">
<div id="inner">
<h:form prependId="false">
<h:outputText value="Type:" />
<h:selectOneMenu id="type" value="#{newItemMB.type}">
<f:selectItem itemLabel="" itemValue="#{null}" noSelectionOption="true"/>
<f:selectItem itemLabel="Drink" itemValue="D" />
<f:selectItem itemLabel="Food" itemValue="F" />
<f:ajax execute="@form" render="selectInputPanel"/>
</h:selectOneMenu>
<h:outputText value="Name:" />
<h:inputText id="name" label="name">
<f:validateLength minimum="1" maximum="100" />
</h:inputText>
<h:outputText value="Price:" />
<h:inputText id="price" label="price">
<f:validateLength minimum="1" maximum="50" />
</h:inputText>
<h:panelGroup id="selectInputPanel">
<h:outputText rendered="#{newItemMB.isTypeD}" value="Size:" />
<h:inputText id="size" label="size" rendered="#{newItemMB.isTypeD}" />
</h:panelGroup>
</h:form>
</div>
</div>
<footer>
<h:outputText value="asd"></h:outputText>
</footer>
</div>
</h:body>
</html>
我的控制器:
package managedBeans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class NewItemMB {
private String type = "D";
private String name;
private int price;
public Boolean getIsTypeD()
{
if(type.equals("D"))
{
System.out.println(type+":true");
return true;
}
else
{
System.out.println(type+":false");
return false;
}
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
難道我做錯了什么?
您的type
完全沒有設置,因此將始終為“ D”。
即使我更改了selectonemenu。
您可以使用setter函數中的System.out.println
自己檢查它。
您需要指定何時激活<f:ajax>
。
此外, execute
屬性是提交信息,因此,如果您未鍵入任何內容並選擇Food選項,則驗證將失敗,因此將不執行后備bean。
如果嘗試在“ 名稱和價格”字段中鍵入內容,然后選擇“ 食物” ,則會發現“ 大小”字段消失。
因此,使用event
並刪除execute
。
像這樣:
<f:ajax event="change" render="selectInputPanel"/>
我試過了,它有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.