Давайте начнем с того, что вы озадачены тем, что происходит в жизненном цикле JSF и когда.Используя следующий обработчик событий, без execMode="partial"
:
<xp:eventHandler event="onclick"
submit="true" refreshMode="partial"
refreshId="pnlInterest">
вы говорите серверу «заново выполнить» всю страницу (это не очень хорошая практика, вы неэффективныо том, какие части страницы сервер может пропустить, потому что они не играют никакой активной роли, и это типичный пример), включая xp:inputText required="true"
.Этап проверки завершается неудачно, потому что вход пуст - он не знает, что он вам больше не нужен - и поэтому пропускает любую другую последующую фазу, которая включает в себя повторное скрытие ввода.
Вы можете исправить это с помощьюдобавив свойство disableValidators="true"
в eventHandler.По сути, это указывает серверу пропустить этап проверки, который даст желаемый результат для вас.На самом деле я редко склоняюсь к этому варианту, потому что вы просто обходите его, сужая объем выполнения.Например, я бы реорганизовал код, чтобы сделать его более эффективным, но также следовал стандартам (на самом деле вы также очищаете ввод, когда снимаете флажок, в таких случаях было бы лучше использовать valueChangeListener
).Он может выглядеть следующим образом:
Bean
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
.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10не использовал disableValidators="true"
в компоненте флажка.Это потому, что я сузил исполнение до самого флажка.Когда форма отправляется на самом деле, сервер будет выполняться только на флажке, игнорируя все остальное, что живет в корне представления (это означает, что xp:inputText required="true"
не беспокоить).