代码之家  ›  专栏  ›  技术社区  ›  Malin

xp验证:inputtext冻结我的Xpage,为什么?

  •  0
  • Malin  · 技术社区  · 6 年前

    在Xpage上,我有一个xp:inputtext控件的show/hide函数。当显示inputbox时,我希望它是强制的。

    <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> 
    

    我怎样才能让这个主意奏效(显示通过复选框输入文本控件,使其成为强制性的,再次隐藏通过复选框,使其不是强制性的)

    1 回复  |  直到 6 年前
        1
  •  3
  •   Community taleinat    4 年前

    让我们先说一下,您被JSF生命周期中发生的事情和时间绊倒了。 execMode="partial" :

    <xp:eventHandler event="onclick"
                            submit="true" refreshMode="partial"
                            refreshId="pnlInterest">
    

    xp:inputText required="true" . 验证阶段失败,因为输入是空的—它不知道您不再需要它—因此跳过任何其他后续阶段,包括再次隐藏输入。

    你可以通过添加 disableValidators="true" valueChangeListener ). 它可以沿着以下路线发展:

    豆子

    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 . 这个 isInterested 方法的存在是为了方便和简洁,但是如果您创建了一个布尔转换器,那么所有这些麻烦都可以避免。

    页面

    <table>
        <tr>
            <td>
                <xp:checkBox id="cbInterest" value="#{controller.interest}"
                    checkedValue="true" uncheckedValue="false" valueChangeListener="#{controller.onInterestChange}">
                    <xp:eventHandler event="onchange" submit="true" execMode="partial" refreshMode="partial"
                        refreshId="rowName" />
                </xp:checkBox>
            </td>
            <td>
                <label class="checkbox">
                    <span>Are you interested in this event?</span>
                </label>
            </td>
        </tr>
        <xp:tr id="rowName">
            <td />
            <td>
                <xp:div styleClass="form-inline" rendered="#{controller.interested}">
                    <div class="form-group">
                        <xp:inputText id="inpYourName" value="#{controller.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:this.validators>
                        </xp:inputText>
    
                        <xp:message id="msg" for="inpYourName" />
                    </div>
                </xp:div>
            </td>
        </xp:tr>
    </table>
    
    <xp:button value="Submit" id="button1">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="complete" />
    </xp:button>
    

    如你所见,我没有利用 disableValidators=“真” 在checkbox组件中。那是因为我把执行范围缩小到了复选框本身。当表单被提交时,实际上服务器将只在复选框上执行,从而忽略视图根上的所有其他内容(这意味着没有) xp:inputText required=“真” 打扰)。