1

ファイル (写真) のアップロードに続いて、いくつかのコンポーネントを再レンダリングしようとしていますが、何らかの理由で、アップロードの完了時にコンポーネントが再レンダリングされません。誰でも助けてもらえますか?Tomcat 6でアプリを実行している64ビットWindows 7マシンでJava 1.6 JSF 1.2 Richfaces 3.3.3 Seam 2.2GAを使用しています。

<h:panelGrid columns="2" id="photoGrid"
    rendered="#{not signUpAction.fileUpRendered}"     styleClass="standard">
    <h:graphicImage value="#{signUpAction.imageUrl}" width="150" height="171" />
    <a4j:region>
        <a4j:commandLink id="remove" action="#{signUpAction.removePhoto}"
            reRender="a4jphotoUpload" value="Remove Photo" />
    </a4j:region>                               
</h:panelGrid>
<h:panelGroup id="photoGroup" rendered="#{signUpAction.fileUpRendered}">
    <rich:fileUpload maxFilesQuantity="1"
        fileUploadListener="#{signUpAction.listener}"
        addControlLabel="Add a photo..." allowFlash="true"
        id="photoUploadWidget" autoclear="true"
        listHeight="1" immediateUpload="true" acceptedTypes="jpg,jpeg,png,gif">
        <f:facet name="label">
            <h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}" />
        </f:facet>
        <a4j:support event="onuploadcomplete" reRender="photoGrid,photoGroup"/>
    </rich:fileUpload>
</h:panelGroup>

コンポーネントを再レンダリングする a4j:jsFunction を呼び出し、onuploadcomplete イベントから呼び出します (以下のコードを参照)。

<h:panelGroup id="photoGroup" rendered="#{signUpAction.fileUpRendered}">
    <rich:fileUpload maxFilesQuantity="1" fileUploadListener="#{signUpAction.listener}"
    addControlLabel="Add a photo..."
    id="photoUploadWidget" autoclear="true" onuploadcomplete="reloadPhotoPanel()" onfileuploadcomplete="reloadPhotoPanel()"
    listHeight="1" immediateUpload="true" acceptedTypes="jpg,jpeg,png,gif">
    </rich:fileUpload>
</h:panelGroup>     
</a4j:outputPanel>  

<a4j:jsFunction id="reloadPhotoPanel" name="reloadPhotoPanel" reRender="photoPanel,photoGrid,photoGroup" />
4

1 に答える 1

2

問題は、ページが最初にロードされたときにレンダリングされなかったコンポーネントを再レンダリングしようとしていることです。これはphotoGridコンポーネントになります。

これを機能させるには、非レンダリング コンポーネントを常にレンダリングされるUIContainer(like <a4j:outputPanel>) 内にラップし、より大きなコンテナーを再レンダリングする必要があります。

<!--
     now you will rerender the a4j:outputPanel 
     and the inner h:panelGrid will appear/dissapear
-->
<a4j:outputPanel id="photoGrid">
    <h:panelGrid columns="2"
        rendered="#{not signUpAction.fileUpRendered}"     styleClass="standard">
        <h:graphicImage value="#{signUpAction.imageUrl}" width="150" height="171" />
        <a4j:region>
            <a4j:commandLink id="remove" action="#{signUpAction.removePhoto}"
                reRender="a4jphotoUpload" value="Remove Photo" />
        </a4j:region>                               
    </h:panelGrid>
</a4j:outputPanel>
<!--
     following the same logic in the h:panelGroup that renders
     the rich:fileUpload component
-->
<a4j:outputPanel id="photoGroup">
    <h:panelGroup rendered="#{signUpAction.fileUpRendered}">
        <rich:fileUpload maxFilesQuantity="1"
            fileUploadListener="#{signUpAction.listener}"
            addControlLabel="Add a photo..." allowFlash="true"
            id="photoUploadWidget" autoclear="true"
            listHeight="1" immediateUpload="true" acceptedTypes="jpg,jpeg,png,gif">
            <f:facet name="label">
                <h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}" />
            </f:facet>
            <a4j:support event="onuploadcomplete" reRender="photoGrid,photoGroup"/>
        </rich:fileUpload>
    </h:panelGroup>
</a4j:outputPanel>
于 2013-01-19T13:54:02.637 に答える