Проверка для xp: inputtext останавливает мою Xpage, почему? - PullRequest
0 голосов
/ 20 сентября 2018

На Xpage у меня есть функция show / hide для элемента управления xp: inputtext.когда отображается поле ввода, я хочу, чтобы оно было обязательным.

Вот мой код:

<xp:panel 
    styleClass="row" 
    id="pnlInterest">       
    <div class="col-sm-12">
        <table>
            <tr>                
                <td>
                    <xp:checkBox id="cbInterest" value="#{eventBean.event.interest}">                       
                        <xp:eventHandler event="onclick"
                            submit="true" refreshMode="partial"
                            refreshId="pnlInterest">
                            <xp:this.action><![CDATA[#{javascript:print("click")
print("selected " + eventBean.getEvent().getInterest())
if(eventBean.getEvent().getInterest() != "true"){

eventBean.getEvent().setYourName("");
}}]]></xp:this.action>
                        </xp:eventHandler></xp:checkBox>
                </td>
                <td>
                    <label class="checkbox">
                        <span>Are you interested in this event?
                    </label>
                </td>
            </tr>
            <tr>
                <td></td>
                <td>
                    <xp:panel>
                        <xp:this.rendered><![CDATA[#{javascript:if ("true" == eventBean.getEvent().getInterest()){
return true;
} else{
return false;
}}]]></xp:this.rendered>
                        <div class="form-inline">
                            <div class="form-group">
                                <xp:inputText
                                    id="inpYourName"
                                    value="#{eventBean.event.yourName}" required="true">
                                    <xp:this.attrs>
                                        <xp:attr
                                            name="placeholder" value="Enter your name" />
                                    </xp:this.attrs>
                                    <xp:this.validators>
                                        <xp:validateRequired
                                            message="You forgot to enter your name">
                                        </xp:validateRequired>
                                    </xp:this.validators></xp:inputText>
                                <xp:message id="msg"
                                    for="inpYourName">
                                </xp:message>
                            </div>
                        </div>
                    </xp:panel>
                </td>
            </tr>
        </table>
    </div>          
</xp:panel> 

Показать / скрыть работает нормально, когда у меня нет установленной проверки для xp:inputtext.Но как только я добавлю это и покажу через флажок, я больше не смогу это скрыть.Событие в onclick больше не вызывается.

Как я могу заставить эту идею работать?(Показать с помощью флажка inputtext control, сделать его обязательным, Снова скрыть его с помощью флажка и сделать его не обязательным)

1 Ответ

0 голосов
/ 20 сентября 2018

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

...