2

私のアプリケーションには、次のコードがあります。

<h:form>
    <h:panelGrid id="initPanel" columns="3">
        <h:outputLabel for="type" value="*Type: " />
        <h:selectOneMenu label="type" id="type" value="#{createNews.type}"
                         required="true" requiredMessage="Type is required.">
            <f:ajax render="typePanel" />
            <f:selectItem noSelectionOption="true" itemLabel="Choose one..." />
            <f:selectItem itemValue="Article" itemLabel="Article" />
            <f:selectItem itemValue="Video"   itemLabel="Video" />
        </h:selectOneMenu>
        <p:message for="type" />

        <h:outputLabel for="title" value="*Title: " />
        <p:inputText label="title" id="title" 
                     value="#{createNews.news.title}" 
                     required="true" requiredMessage="Title is required." />
        <p:message for="title" />
    </h:panelGrid>

    <h:panelGroup id="typePanel">
        <h:panelGrid rendered="#{createNews.type == 'Article'}" columns="1">
            <h:panelGrid columns="2">
                <h:outputLabel for="content" value="*Content: " />
                <p:message id="contentMsg" for="content" />
            </h:panelGrid>

            <p:editor id="content" value="#{createNews.news.content}" width="580" />
        </h:panelGrid>

        <h:panelGrid rendered="#{createNews.type == 'Video'}" columns="3">
            <h:outputLabel for="embedCode" value="*Embed code: " />
            <p:inputText label="embedCode" id="embedCode" 
                         value="#{createNews.news.embedCode}" />
            <p:message for="embedCode" />
        </h:panelGrid>
    </h:panelGroup>

    <p:commandButton value="Confirm" update="initPanel typePanel" actionListener="#{createNews.createNews}" />

</h:form>

そして、これはマネージドBeanです。

@Named(value = "createNews")
@RequestScoped
public class CreateNews {
    private Integer type;
    private News    news;

    public void createNews() {...}

    // Getters and Setters
}

Articleまたはを選択するVideoと、対応する部分がで正しくレンダリングされtypePanelます。以下の例では、選択VideoしてそのEmbed code部分をレンダリングしました。

埋め込みコード部分は正しくレンダリングされます。

しかし、クリックするConfirmと先にレンダリングした部分が突然消えてしまいます。

埋め込みコード部分が消えました!

どういうわけか、type私の管理対象Beanのプロパティはの値を受け取りませんでした<h:selectOneMenu>

アドバイスをいただければ幸いです。

よろしくお願いします、

4

1 に答える 1

1

この問題は、次の2つの事実が原因で発生します。

  • リクエストスコープのBeanは、すべてのリクエスト(ajaxリクエストを含む)で作成されます。
  • 一般的な検証が失敗した場合、モデル値は更新されません。

renderedドロップダウンを変更すると、属性に適切なプロパティが設定された1つのリクエストスコープBeanが作成されます。ただし、リクエストスコープのBeanは、もちろんリクエストの終了によってガベージされます。確認ボタンを送信すると、すべてのプロパティがデフォルトに設定された新しいリクエストスコープのBeanが作成されますが、一般的な検証の失敗のために更新されないため、rendered属性はに評価されfalseます。

BeanをJSFビュースコープまたはCDI会話スコープに配置すると、問題が解決するはずです。

UIInput別の方法は、ドロップダウンを現在のビュースコープのにバインドし、UIInput#getValue()代わりに選択した値を評価することです。

<h:selectOneMenu ... binding="#{type}">
...
<h:panelGrid rendered="#{type.value == 'Article'}">
...
<h:panelGrid rendered="#{type.value == 'Embed'}">

参照:

于 2012-06-15T14:14:34.570 に答える