我有一个带有inputText和2 commandButtons的简单表单。 inputText显示支持bean的值很好,但是当我第一次更改值时,不调用set方法,因此表单提交为空值。当我再次更改它时,调用set方法,一切正常。原因是什么?如何解决?
<h:panelGroup id="chatId">
<h:panelGrid rendered="#{chat.validUser == true}">
<h:form id="sendMsgForm" >
<h:panelGroup id="chatId2">
<h:inputText id="chatInput" value="#{chat.msgTo}" autocomplete="off" >
<f:ajax execute="@this @form" />
</h:inputText>
<h:commandButton value="Send" id="sendButton" action="#{chat.send}">
<f:ajax render=":chatLogId :chatId" />
</h:commandButton>
<h:commandButton value="Bye" action="#{chat.bye}">
<f:ajax render=":chatLogId :chatId :chatUserId" />
</h:commandButton>
</h:panelGroup>
</h:form>
</h:panelGrid>
</h:panelGroup>
支持bean代码:
@SessionScoped
public class Chat implements Serializable, ActionListener, ValueChangeListener {
private String msgTo = "Start typing...";
private boolean validUser = false;
public void bye() {
validUser = false;
tc.disconnect();
}
public void send() {
try {
tc.sendMessage(msgTo);
setMsgTo("");
} catch (Exception e) {
e.printStackTrace();
}
}
// ...
答案 0 :(得分:3)
Matt Handy的代码片段是正确的解决方案,但原因的解释是错误的。
您在命令按钮中省略了execute
的{{1}}属性。然后它将默认为<f:ajax>
,这意味着只有按钮本身的name = value对被发送到服务器端(因此仅将调用相关的操作;输入值不会更新)。由于您要提交整个表单,因此需要将@this
明确设置为execute
。
@form
在更改输入字段期间它的工作原理是因为您已将<h:commandButton value="Send" id="sendButton" action="#{chat.send}">
<f:ajax execute="@form" render=":chatLogId :chatId" />
</h:commandButton>
放在输入字段中。更改值时,默认情况下会执行execute="@form"
内部输入字段。但在这种特殊情况下,你完全不需要它。所以摆脱它:
<f:ajax>
答案 1 :(得分:0)
也许是因为你同时使用并发行为触发了两个ajax调用。如果单击sendButton,将重新呈现chatId panelGroup(通过提交按钮的ajax调用)并执行表单(通过输入字段的ajax调用)。
请尝试以下方式进行提交按钮的ajax调用:
<h:commandButton value="Send" id="sendButton" action="#{chat.send}">
<f:ajax render=":chatLogId :chatId" execute="@form"/>
</h:commandButton>
答案 2 :(得分:0)
想要跟进我的问题的答案是将我拥有的3个表单标签合并为两个表单。我有一个用于chatLogId的表单,1表示chatId,1表示chatUserId。 chatLogId只是一个dataTable,我就离开了。我将chatId和chatUserId表单合并为一个。当我离开inputText字段时,调用setMsgTo然后调用send方法。不确定,但我认为我的问题可能是之前更新了错误的表单。 感谢你的帮助。平