PullRequest
       27

2 голосов
/ 29 марта 2011

У меня есть простая форма с inputText и 2 кнопками command.Параметр inputText отображает значение базового компонента в порядке, но когда я изменяю значение в первый раз, метод 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>

Код поддерживающего компонента:

@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();
    }
  }

  // ...

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Фрагмент кода Мэтта Хэнди является правильным решением, но объяснение причины является неправильным.

Вы пропустили атрибут execute <f:ajax> в командной кнопке.Затем по умолчанию будет установлено значение @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> внутри полей ввода будет по умолчанию выполняться при изменении значения.Но в данном конкретном случае вам это вообще не нужно.Так что избавься от этого:

<h:inputText id="chatInput" value="#{chat.msgTo}" autocomplete="off" />
0 голосов
/ 05 апреля 2011

Хочу проследить, чтобы ответом на мою проблему было объединение трех имеющихся у меня тегов форм в две формы.У меня была 1 форма для chatLogId, 1 для chatId и 1 для chatUserId.ChatLogId - это просто dataTable, и я оставил это в покое.Я объединил формы chatId и chatUserId в одну.Когда я сейчас покидаю поле inputText, вызываются методы setMsgTo и затем send.Не уверен, но я думаю, что моя проблема может быть в том, что неправильная форма была обновлена ​​раньше.Спасибо за вашу помощь.Бинь

0 голосов
/ 30 марта 2011

Возможно, это потому, что вы одновременно запускаете два 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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...