h: selectOneMenu ValueChangeEvent запускает h: commandButton onclick? - PullRequest
1 голос
/ 12 октября 2011

У меня есть следующий выпадающий список, с которым связано событие, когда пользователь выбирает значение из этого выпадающего списка, остальные выпадающие списки вместе с таблицей заполняются соответственно:

 <Td>
 <h:selectOneMenu id="combocarList" 
     value="#{customerBean.selectedcar}"
     styleClass="comboStyle"
     valueChangeListener="#{customerBean.loadothercombos}"
     onchange="document.forms[0].submit()"
 >
     <f:selectItem
    itemLabel="-----------Select--------------"
    itemValue="None" />
      <f:selectItems value="#{customerBean.carsList}" />
   </h:selectOneMenu>
  </Td>

iтакже есть h:commandButton, как показано ниже:

<TD>
    <h:commandButton id="btnCheckVals" value="Submit"
    onclick="return checkSelectedVal(this);"
    ></h:commandButton>
 </TD>

Когда я нажимаю кнопку «Отправить», вызывается событие, связанное с раскрывающимся списком выше, и функция javascript никогда не вызывается!такое ожидаемое поведение?и если да, то как я могу сделать так, чтобы функция javascript вызывалась до запуска события, позволяя проверить, выбрал ли пользователь значения из раскрывающихся списков.

1 Ответ

1 голос
/ 12 октября 2011

Я не уверен, что вы прочитали мой ответ на одном из своих предыдущих вопросов.Вы никогда не давали никаких отзывов и приняли другой ответ.Я уже предупреждал, что такой подход - хакерский.

Вы в основном злоупотребляете valueChangeListener здесь.Его единственная цель состоит в том, чтобы предоставить точку для одновременного доступа к и старому и новому значению, чтобы при необходимости можно было выполнять конкретные бизнес-действия, например регистрировать оба значения.

Использование его с единственной целью для "автоматического" заполнения другого компонента / элемента на основе только нового значения (вас совершенно не интересует старое значение) является хаком.Если вы уже используете JSF 2.0, я настоятельно рекомендую подход <f:ajax>, упомянутый в связанном ответе.

Возвращаясь к вашей конкретной проблеме, вы должны понимать, что valueChangeListener будет всегда запускается всякий раз, когда представленное значение отличается от исходного значения модели.Это не зависит от всей этой помощи JavaScript.onchange="submit()" специально не вызывает прослушиватель, он просто отправляет на сервер форму whole .Это просто происходит, когда конечный пользователь меняет раскрывающийся список, поэтому изменение гарантировано, и слушатель будет вызываться на стороне сервера.

Ваша проблема предполагает, что вы не входите в набор valueChangeListenerзначение модели с введенным значением и то, что вы звоните FacesContext#renderResponse().Этот подход почти такой же, как продемонстрированный в первом способе моего связанного ответа: ожидайте строки, которая устанавливает представленное значение в качестве значения модели.Поскольку вы не установили его, любая последующая отправка формы всегда будет запускать слушателя (потому что переданное значение отличается от значения модели!).Кроме того, поскольку FacesContext#responseComplete() пропускает фазу действия invoke, метод действия никогда не вызывается.

Теперь перечитайте мой связанный ответ еще раз, как правильно его реализовать.

...