h:使用AJAX更改h:selectOneMenu的值时未呈现panelGroup

时间:2013-11-19 12:28:46

标签: ajax jsf jsf-2 render

我有一个网格组,在更改selectOneMenu的值时应该渲染。我已将valueChangeListener附加到selectOneMenu并且它成功访问了分配给它的函数,但html组件不会重新呈现。无论如何,标志决定了渲染的奇怪之处。

<h:selectOneMenu value="#{channelsAdmin.profileID}" id="profileDrp" valueChangeListener="#{channelsAdmin.setProfileInit}">
    <f:selectItems value="#{channelsAdmin.profiles}" var="Profile"
         itemLabel="#{Profile.profileName}"
        itemValue="#{Profile.profileId}" />
    <f:ajax execute="@this" immediate="true" render="pnl"></f:ajax>
</h:selectOneMenu> 
<h:panelGroup id="pnl" rendered="#{channelsAdmin.ccpAuthPanelFlage}">
    <h:inputText id="sest" value="hew">
    </h:inputText>
</h:panelGroup>

豆:

public void setProfileInit(ValueChangeEvent e) {
    ccpAuthPanelFlage=true;
    ccpPurchPanelFlage=true;
}

1 个答案:

答案 0 :(得分:2)

<f:ajax render="pnl">大致如下:

  1. 当ajax响应到达时,从XML响应中获取带id="pnl"的更新元素。
  2. 现在通过id="pnl"从HTML文档中获取document.getElementById()的元素。
  3. 使用XML响应中的update元素替换其内容。
  4. 在您的特定情况下,第2步失败,因为HTML文档中没有此类元素。它在HTML文档中不存在,因为它从未在第一时间呈现过。

    您需要确保<f:ajax render="...">引用始终呈现的元素,以便JavaScript可以document.getElementById()找到它以替换其内容。

    <h:selectOneMenu value="#{channelsAdmin.profileID}" id="profileDrp" valueChangeListener="#{channelsAdmin.setProfileInit}">
        <f:selectItems value="#{channelsAdmin.profiles}" var="Profile"
             itemLabel="#{Profile.profileName}"
            itemValue="#{Profile.profileId}" />
        <f:ajax execute="@this" immediate="true" render="pnl"></f:ajax>
    </h:selectOneMenu>
    <h:panelGroup id="pnl">
        <h:panelGroup rendered="#{channelsAdmin.ccpAuthPanelFlage}">
            <h:inputText id="sest" value="hew">
            </h:inputText>
        </h:panelGroup>
    </h:panelGroup>
    

    另见: