2

次のコマンドを使用して、ページの一部を更新しようとしています。

<p:commandButton id="bntNewAddress" immediate="true"
value="New Address" disabled="false" icon="ui-icon-document"
process="@this" update=":main_form:createPanelDetailsAddress"
action="#{issuerComponent.initAddNewAddress}">
</p:commandButton>

ボタンをクリックすると、パネル「createPanelDetailsAddress」が更新されません。一方、update=":main_form" を使用すると、パネルが更新されます (ただし、main_form 内の他のすべてのパネルも更新されます)。更新するパネルは、"createPanel" という名前のパネルに含まれています。

私の場合、なぜ update=":main_form:createPanelDetailsAddress" が機能しないのか、誰にもわかりますか?

私はprimefaces3.5とMojarra JSF 2.1.7を使用しています

使用したコードは次のとおりです。

public String initAddNewAddress(){
 renderCreatePanelDetailsAddress = true;
 return null;
}

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui" template="/template.xhtml">

<ui:define name="content">
    <h:form id="main_form">
        <p:panel id="createPanel" rendered="true">

            <p:messages id="msgCreate" />

            <p:panel id="createPanelDetails"
                header="#{issuerMsgs['issuer.createArea.title']}">

                <h:panelGrid border="0" columns="6">

                    <h:outputText value="#{issuerMsgs['issuer.issuerCode.title']}:" />
                    <p:inputText required="true"
                        value="#{issuerComponent.updateIssuer.issuerCode}"
                        label="issuer_issuerCode">

                    </p:inputText>
                    <h:outputText value="#{issuerMsgs['issuer.description.title']}:" />
                    <p:inputText required="true"
                        value="#{issuerComponent.updateIssuer.description}"
                        label="issuer_description">

                    </p:inputText>
                </h:panelGrid>
            </p:panel>

            <p:spacer height="10" />

            <p:panel id="panelListAddress"
                header="#{addressMsgs['address.createArea.title']}">

                <p:dataTable id="addresslist" var="address"
                    value="#{issuerComponent.addressList}" paginator="false" rows="10">
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="#{addressMsgs['address.tel.title']}" />
                        </f:facet>
                        <h:outputText value="#{address.tel}" />
                    </p:column>

                </p:dataTable>

                <p:spacer height="22" width="0" />

                <p:commandButton  id="bntNewAddress" immediate="true"
                    value="New Address" disabled="false" icon="ui-icon-document"
                    process="@this" update=":main_form:createPanelDetailsAddress"
                    action="#{issuerComponent.initAddNewAddress}">
                </p:commandButton>

            </p:panel>

            <p:panel id="createPanelDetailsAddress"
                header="#{addressMsgs['address.createArea.title']}"
                rendered="#{issuerComponent.renderCreatePanelDetailsAddress}">

                <ui:include src="createAddress.xhtml"></ui:include>

                <p:commandButton value="Add"
                    rendered="#{issuerComponent.renderBtnAddAddress}" disabled="false"
                    icon="ui-icon-document" process="@this,createPanelDetailsAddress"
                    update=":main_form" action="#{issuerComponent.addNewAddress}"
                    actionListener="#{addressComponent.addNewComposite}">

                    <f:setPropertyActionListener
                        value="#{addressComponent.updateAddress}"
                        target="#{issuerComponent.address}" />
                </p:commandButton>
            </p:panel>

        </p:panel>
    </h:form>
</ui:define>
</ui:composition>
4

1 に答える 1

3

更新が失敗するのは

 rendered="#{issuerComponent.renderCreatePanelDetailsAddress}"

ビューが最初にレンダリングされたときにfalseと評価されます。その結果、ビューが最初にレンダリングされたとき、コンポーネントはDOMツリーにありません。

Ajaxの更新は、DOM内の特定のコンポーネントを(によってid)見つけて、新しいマークアップに置き換えることで機能します。あなたのパネルはそもそもDOMになかったので、ajaxで更新するものは何もありません。

修正するには、を別のコンポーネントでラップし、<p:panel/>そのコンポーネントをajaxアップデートのターゲットにする必要があります

    <p:outputPanel id="container" layout="none">
       <p:panel id="createPanelDetailsAddress" header="# addressMsgs['address.createArea.title']}" rendered="#issuerComponent.renderCreatePanelDetailsAddress}">
            <ui:include src="createAddress.xhtml"></ui:include>
            <p:commandButton value="Add"
                rendered="#{issuerComponent.renderBtnAddAddress}" disabled="false"
                icon="ui-icon-document" process="@this,createPanelDetailsAddress"
                update=":main_form" action="#{issuerComponent.addNewAddress}"
                actionListener="#{addressComponent.addNewComposite}">

                <f:setPropertyActionListener
                    value="#{addressComponent.updateAddress}"
                    target="#{issuerComponent.address}" />
            </p:commandButton>
        </p:panel>
    </p:outputPanel>
于 2013-03-22T03:32:45.217 に答える