‹p:commandButton УСЛОВНОЕ событие onclick

у меня есть jsf-форма с полем ввода и кнопкой сохранения, как показано в коде ниже. Чего я хочу добиться, так это того, что при нажатии кнопки сохранения ввод должен быть проверен с помощью шаблона регулярного выражения. Если проверка не удалась, диалоговое окно подтверждения сохранения отображаться не должно. В противном случае отображается диалоговое окно подтверждения сохранения, и пользователь может выбрать, сохранять или нет.

В приведенном ниже коде диалоговое окно всегда показывалось, несмотря на условное onclick="if(#{conditionOK}). Я не хочу, чтобы диалоговое окно подтверждения отображалось, когда условиеOK возвращает false!!! После многих попыток я думаю, что FacesContext .isValidateFailed() не будет переоцениваться.

Пожалуйста помоги :(

Все, что я хочу, это только проверить, возвращает ли regex-Validator true. В этом случае должно быть показано диалоговое окно подтверждения.

Мой подход может быть неправильным. Большое спасибо, если у вас, ребята, есть и другие решения.

<h:form id="save_all_form">
      <p:inputTextarea rows="1" style="width:100%;resize:none"
         value="#{cusBean.saveAll}" autoResize="false"
         validatorMessage="Wrong format">
         <f:validateRegex pattern="#{msgs.pattern}" />
      </p:inputTextarea>

      <ui:param name="conditionOK" 
         value="#{facesContext.postback and !facesContext.validationFailed}"  />

      <p:commandButton value="#{msgs.button_overwrite_all}"
         onclick="if(#{conditionOK}){confirmation.show()}"/>
</h:form>

person Tim Long    schedule 11.10.2013    source источник
comment
Итак, когда страница отображается и пользователь вводит что-то в текстовое поле, которое не пройдет проверку, вы хотели бы показать диалоговое окно подтверждения? Пожалуйста, объясните процесс немного подробнее.   -  person user1983983    schedule 11.10.2013
comment
Я обновил свой вопрос. Раздражает, что кто-то отредактировал вопрос.   -  person Tim Long    schedule 11.10.2013


Ответы (2)


Я не думаю, что вам подойдет JSF-валидация. Он предназначен для предотвращения изменения данных модели в случае, если проверка не пройдена.
И если вы хотите сделать проверку в JavaScript, вам необходимо обновить раздел в HTML. JavaScript не пересчитывает Expression, поэтому значение при первом отображении представления будет использоваться каждый раз.

Попробуйте следующее в xhtml:

<h:form id="save_all_form">
  <p:inputTextarea id="input" rows="1" style="width:100%;resize:none"
     value="#{cusBean.saveAll}" autoResize="false">
     <p:ajax global="false" update="input submit" partialSubmit="true"/>
  </p:inputTextarea>

  <p:commandButton id="submit" value="#{msgs.button_overwrite_all}"
     onclick="if(#{cusBean.validate(msgs.pattern)}){confirmation.show()}"/>
</h:form>

И добавьте этот метод в CusBean:

public boolean validate(String pattern) {
  return getSaveAll().matches(pattern);
}

Результатом будет то, что проверка JSF не выполняется, и значение textArea отправляется каждый раз, когда вы его меняете. Кроме того, обновляется раздел commandButton, поэтому условие будет обновлено.

person user1983983    schedule 11.10.2013
comment
Вы имеете в виду, что FacesContext.validateFailed является Javascript-вызовом? Это не. Как упоминалось в этом сообщении, ui:param будет переоцениваться каждый раз значение привыкнет. - person Tim Long; 11.10.2013
comment
Это прямо противоположно тому, что я сказал, я сказал, что if(#{conditionOK}){confirmation.show()} - это вызов JavaScript, и, поскольку вы никогда не обновляете commandButton, #{conditionOK} всегда будет начальным значением, которое равно true. Выражения оцениваются только во время рендеринга просмотра. - person user1983983; 11.10.2013

Как и в другом объясненном ответе, событие onclick слишком рано для проверки статуса проверки запроса JSF (с использованием !facesContext.validationFailed), поскольку запрос еще не отправлен; Проверка не выполнялась, поэтому статус проверки всегда будет ложным (ну, вроде того) во время onclick.

Итак, что вам нужно сделать, это выполнить ajax-проверку поля (как показано в предыдущем ответе), а затем использовать переменную primefaces args для проверки статуса запроса:

<p:commandButton value="#{msgs.button_overwrite_all}" id="createReport" onclick="if(!args.validationFailed){confirmation.show();}"/>
person kolossus    schedule 13.10.2013