0

ap:dialogを実装しようとしています。その中に選択リストがあります。選択した項目に基づいて、ダイアログボックスのテンプレートを更新する必要があります。これは正常に機能しています。ただし<p:commandButton>、動的にレンダリングされたテンプレートにが含まれている場合、そのactionListenerが起動されることはありません。

例:view.xhtml

<p:dialog modal="true" id="addSocialMediaAddressDialogPanel" widgetVar="addSocialMediaAddressDialog" width="500" >
<h:form id="addSocialMediaAddressForm">
    <h:messages />
    <p:selectOneMenu id="currentAddingSocialMedia" value="#{requestScope.selectedMedia}" >  
        <f:selectItems value="#{WebResource.getListByName('SOCIAL_MEDIAS')}" />
        <p:ajax update="addSocialMediaAddressContentPanel" process="@this" />
    </p:selectOneMenu>
    <p:outputPanel id="addSocialMediaAddressContentPanel">
        <ui:include src="#{contactBean.resolveTemplate(requestScope.selectedMedia)}"/>
    </p:outputPanel>    
</h:form>
</p:dialog>

私はこのようなテンプレートを持っています

templates
    |_ twitter.xhtml
    |_ facebook.xhtml
    |_ googlePlus.xhtml

twitter.xhtml

<table>
    <tr>
        <td>
            <h:outputLabel  styleClass="standardText" value="Twitter Screen Name"/>
        </td>
        <td>
            <p:inputText id="twitterScreenName" value="#{requestScope.twitterScreenName}"/>
        </td>
    </tr>
    <tr>
        <td>
            <p:commandButton value="Add Account" actionListener="#{contactBean.addTwitterAccount(requestScope.twitterScreenName)}" styleClass="btn-blue" process="@form" update=":growl, :messageForm"/>
        </td>
    </tr>
</table>

そしてこれはバッキングビーンです

@Component
@Scope("session")
public class ContactBean implements Serializable {

    private static String SOCIAL_MEDIA_ACCOUNTS_TEMPLATE_PARENT_DIRECTORY = "/templates/";

    public void addTwitterAccount(String screenName){
        //this contiains the implmentation
    }

    public String resolveTemplate(String socialMedia){
        if(socialMedia.equalsIgnoreCase("Twitter")){
            return SOCIAL_MEDIA_ACCOUNTS_TEMPLATE_PARENT_DIRECTORY + "twitter.xhtml";
        }
        if(socialMedia.equalsIgnoreCase("Facebook")){
            return SOCIAL_MEDIA_ACCOUNTS_TEMPLATE_PARENT_DIRECTORY + "facebook.xhtml";
        }
        else if(socialMedia.equalsIgnoreCase("Google+")){
            return SOCIAL_MEDIA_ACCOUNTS_TEMPLATE_PARENT_DIRECTORY + "googlePlus.xhtml";
        }
        return "";
    }
}

このシナリオでは、templatesディレクトリの下にあるテンプレートの一部であるactionListenerを起動できません。JSF2.1.7とPrimefaces3.3を使用しています。

4

3 に答える 3

2

犯人はここにいます:

<ui:include src="#{contactBean.resolveTemplate(requestScope.selectedMedia)}"/>

これは、フォームが表示された最初の HTTP リクエスト中に評価されるだけでなく、フォーム送信が処理される後続の HTTP リクエスト中にも評価されます。

selectedMediaは、最初のリクエストの終わりまでに失われるリクエストスコープ変数のようです。したがって、フォーム送信を処理する後続の HTTP 要求ではnull、ビューの作成中にテンプレートがまったく含まれないと評価されます。この方法では、JSF はコマンド ボタン コンポーネントを実行できないdecode()ため、そのアクションが決定されてキューに入れられることはありません。

selectedMedia後続の HTTP 要求で変数が保持されていることを確認する必要があります。<f:param>その方法の 1 つは、コマンド ボタン内または<input type="hidden">フォーム内で、リクエスト パラメータとして後続のリクエストに渡すことです。

于 2013-01-03T12:05:51.187 に答える
0

BeanのactionListenerのメソッドには、ActionEventパラメーターが必要です。このチュートリアルを参照してください

于 2013-01-03T10:26:08.380 に答える
0

<h:form>子テンプレートで使用されているものを削除します。親テンプレートに1 つだけ保持<h:form>し、親テンプレートに含めた他のすべての子テンプレートから削除します。<ui:include>

于 2018-12-25T16:48:45.593 に答える