让我们先说一下,您被JSF生命周期中发生的事情和时间绊倒了。
execMode="partial"
:
<xp:eventHandler event="onclick"
submit="true" refreshMode="partial"
refreshId="pnlInterest">
xp:inputText required="true"
. 验证阶段失败,因为输入是空的—它不知道您不再需要它—因此跳过任何其他后续阶段,包括再次隐藏输入。
你可以通过添加
disableValidators="true"
valueChangeListener
). 它可以沿着以下路线发展:
豆子
public class Controller implements Serializable {
private static final long serialVersionUID = 1L;
private String interest;
private String yourName;
public String getInterest() {
return interest;
}
public String getYourName() {
return yourName;
}
public boolean isInterested() {
return interest != null && Boolean.valueOf(interest);
}
public void setInterest(String interest) {
this.interest = interest;
}
public void setYourName(String yourName) {
this.yourName = yourName;
}
public void onInterestChange(ValueChangeEvent event) throws AbortProcessingException {
if ("true".equals(event.getNewValue())) {
setYourName(null);
}
}
}
这个
onInterestChange
interest
将设置为与布尔值不同的值
true
.
这个
isInterested
方法的存在是为了方便和简洁,但是如果您创建了一个布尔转换器,那么所有这些麻烦都可以避免。
页面
<table>
<tr>
<td>
<xp:checkBox id="cbInterest" value="#{controller.interest}"
checkedValue="true" uncheckedValue="false" valueChangeListener="#{controller.onInterestChange}">
<xp:eventHandler event="onchange" submit="true" execMode="partial" refreshMode="partial"
refreshId="rowName" />
</xp:checkBox>
</td>
<td>
<label class="checkbox">
<span>Are you interested in this event?</span>
</label>
</td>
</tr>
<xp:tr id="rowName">
<td />
<td>
<xp:div styleClass="form-inline" rendered="#{controller.interested}">
<div class="form-group">
<xp:inputText id="inpYourName" value="#{controller.yourName}"
required="true">
<xp:this.attrs>
<xp:attr name="placeholder" value="Enter your name" />
</xp:this.attrs>
<xp:this.validators>
<xp:validateRequired message="You forgot to enter your name" />
</xp:this.validators>
</xp:inputText>
<xp:message id="msg" for="inpYourName" />
</div>
</xp:div>
</td>
</xp:tr>
</table>
<xp:button value="Submit" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete" />
</xp:button>
如你所见,我没有利用
disableValidators=“真”
在checkbox组件中。那是因为我把执行范围缩小到了复选框本身。当表单被提交时,实际上服务器将只在复选框上执行,从而忽略视图根上的所有其他内容(这意味着没有)
xp:inputText required=“真”
打扰)。