【问题标题】:Rendering doesnt work for a4j:outputPanel渲染不适用于 a4j:outputPanel
【发布时间】:2013-08-23 08:02:37
【问题描述】:

我设计了一个 jsf 页面,我的场景是基于更改 selectonemenu 中的下拉菜单来呈现输出面板。我的问题是输入文本框中的required=true。它不允许其他组件呈现,当我在文本框中给出值时,它允许 selectonemenu 呈现。我做错了什么。请有人解决我的问题

代码

<a4j:outputPanel id="thapalSection" >
    <ui:fragment>
        <fieldset style="table-layout: fixed;">
            <legend>#{msg.lbl_post_offSect}</legend>
            <table border="0" cellpadding="1" cellspacing="15" width="100%" 
                style="border-width: 1px;border-spacing: 1px;border-style: solid;border-color:#c2c2c2">
                <tr>
                    <td align="left"  width="20%">#{msg.lbl_SenDTo}<span>
                        <font color="red"><b>*</b></font></span>
                    </td>
                    <td align="left"  colspan="3"  width="30%">
                        <a4j:outputPanel id="tapalSectionSendToPanel">
                            <h:inputText id="sendToId"  value="#{DataBean.kabalSectionBean.sendTo}"  class="createresizedTextbox"
                                readonly="true" required="true" requiredMessage="#{msg.labl_required}" />
                            <h:message for="sendToId" style="color:red" />
                        </a4j:outputPanel>
                    </td>
                </tr>
                <tr>
                    <td align="left"  width="20%" >#{msg.lbl_lettRef}</td>
                    <td align="left"  width="34%" >
                        <a4j:outputPanel id="letterReferenceIDPAnel">
                            <h:inputText id="lettRefId" value="#{DataBean.kabalSectionBean.letterFileRefNo}" 
                                class="createresizedTextbox"  required="true" requiredMessage="#{msg.labl_required}" immediate="true"/>
                            <h:message  for="lettRefId" style="color:red" />
                        </a4j:outputPanel>
                    </td>
                </tr>
                <tr>
                    <td>#{msg.lbl_Sender_type}</td>
                    <td>
                        <a4j:outputPanel id="senderTypePanel" >
                            <h:selectOneMenu value="#{DataBean.kabalSectionBean.senderType}" class="createresizedTextbox"  id="senderTypeID">
                                <a4j:ajax event="change" render="thapalSection internalPanel" listener="#{FileTrackAction.selectSenderType}"  />
                                <f:selectItem itemValue="--select--" itemLabel="--Select--" />
                                <f:selectItem itemValue="internal" itemLabel="Internal" />
                                <f:selectItem itemValue="external" itemLabel="External" />
                                <f:validator validatorId="org.gov.tnwrd.bean.validation.DropdownValidation" />
                            </h:selectOneMenu>
                            <h:message for="senderTypeID" style="color:red" />
                        </a4j:outputPanel>
                    </td>
                </tr>
                <a4j:outputPanel id="internalPanel" >
                    <ui:fragment  rendered="#{DataBean.kabalSectionBean.sendTypeIntEnabled==true}" >
                        <tr>
                            <td align="left"  width="20%" >#{msg.lbl_office_name}</td>
                            <td align="left" width="34%">
                                <h:inputText id="internalType" value="#{DataBean.kabalSectionBean.officeName}" class="createresizedTextbox"  readonly="true" />
                            </td>
                            <td align="left" width="17%"  >#{msg.lbl_type_letter}</td>
                            <td align="left">
                                <h:selectOneMenu class="createresizedTextbox" value="#{DataBean.kabalSectionBean.typeOfletter}">
                                    <f:selectItem itemValue="--" itemLabel="--Select--" />
                                    <f:selectItem itemValue="ordinaryLetter" itemLabel="Ordinary Letter" />
                                    <f:selectItem itemValue="doLetter" itemLabel="D.O Letter" />
                                    <f:selectItem itemValue="confidentialLetter" itemLabel="Confidential Letter" />
                                    <f:selectItem itemValue="OtherLetter" itemLabel="Other Letter" />
                                </h:selectOneMenu>
                            </td>
                        </tr>
                    </ui:fragment>
                </a4j:outputPanel>
            </table>
        </fieldset>
    </ui:fragment>
</a4j:outputPanel>
</td>
</tr>
</table>
</td>
</tr> 
</table>
<table cellspacing="1" cellpadding="15" width="100%" border="0">
    <tr>
        <td></td>
        <td colspan="6" align="right">
            <div class="buttons">
                <a4j:commandButton id="addThapal" value="#{msg.btn_send}" type="button" render="thapalPanel savePopUp" action="#{FileTrackAction.saveThapalDetails}" oncomplete="if(#{DataBean.kabalSectionBean.statusCode eq 'Success'})  #{rich:component('savePopUp')}.show();"/>
                <a4j:commandButton id="clearId" value="#{msg.btn_clear}" render="thapalPanel" action="#{FileTrackAction.clearTapalSection}"  type="button" />
            </div>
        </td>
    </tr>
</table>
</a4j:outputPanel>

【问题讨论】:

    标签: jsf richfaces


    【解决方案1】:

    问题是,验证失败。这会导致 JSF 中断其生命周期并从验证直接跳转到渲染,而不会在两者之间进行任何更改。

    我不知道您何时设置DataBean.kabalSectionBean.sendTypeIntEnabled,但您可以检查该值不会设置为true,因此您的面板不会更改。

    您在这里有不同的选择。您可以使用immediate="true" 属性跳过验证,也可以使用execute="list of components you want to execute"。执行意味着,数据将被发送到支持 bean,将被验证并为此输入调用 setXXX(...) 方法。在这里您不会列出必填字段,因此其验证不会成为问题。

    如果你使用execute="@none",它的效果和immediate="true"一样。

    【讨论】:

    • 是的,你在第一段中所说的是真的。应该做什么
    • 我给你写了不同的选项。我认为您应该在 或 execute="@this" 中使用 immediate="true"
    • 我试过这样 但没用
    • 你为什么不按我说的试试看呢?没有像@internalPanel 这样的东西。如果您有一个名为“internalPanel”的组件,请在不使用“@”的情况下使用它。但是您不想执行“internalPanel”。您只想执行下拉菜单的选择。 ---> @this
    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 2011-06-14
    • 2016-05-22
    • 2018-11-20
    • 2015-07-05
    • 1970-01-01
    • 2019-04-28
    • 2016-06-22
    相关资源
    最近更新 更多