0

私は次のコードを持っています、jsf2.2、primefaces3.2を使用しています。私の要件は、updateFlagに応じてプロジェクトを更新することです。次のコードのようにc:if(xmlns:c = "http://java.sun.com/jsp/jstl/core")を使用すると、UpdatecommandButtonのアクションリスナーが呼び出されません。しかし、<c:if>の代わりに<p:panel render = "#{projectBean.updateFlag}">を使用すると、機能します。私がそれを手に入れるのを手伝ってください、私はc:ifを使うべきだと思いますが、それは機能しません。

<p:dialog widgetVar="projectUpdate" id="projectUpdatePanel" modal="false" >

                <p:panel>
                    <c:if test="#{projectBean.updateFlag == false}">
                            <h:outputText value="Project Title" />
                            <p:inputText disabled="true" value="#{projectBean.selectedProjectDo.projectTitle}" />
                            <p:commandButton value="Update" disabled="true" />
                            <p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
                    </c:if>
                    <c:if test="#{projectBean.updateFlag == true}">                           
                            <h:outputText value="Project Title"/>
                            <p:inputText value="#{projectBean.selectedProjectDo.projectTitle}" />
                            <p:commandButton value="Update" actionListener="#{projectBean.updateProject}" />
                            <p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
                    </c:if>
                </p:panel>

            </p:dialog>
4

2 に答える 2

2

これは非DRYコードの典型的な例であり、悪いことです。Daniel は DRY にする方法を完璧に示していますが、問題の原因については説明していません。

問題の症状に基づいて#{projectBean}、ビュー スコープ Bean の場合に発生します。ビュー スコープ Bean は、JSF ビュー ステートに格納されます。そのため、ビュー スコープ Bean は、ビュー フェーズの復元後にのみ使用できます。ただし、JSTL タグは復元ビュー フェーズで実行されますが、ビュー スコープ Bean はまだ利用できません。これにより、まったく新しいビュー スコープ Bean インスタンスが作成され、その後、復元された JSF ビュー ステートに格納された実際のビュー スコープ Bean に置き換えられます。JSTL で使用される新しい別のビュー スコープ Bean は、すべてのプロパティがデフォルトに設定されているため、ブロックupdateFlag=false常に呼び出されます。

以下も参照してください。

于 2012-12-19T13:35:35.447 に答える
2

次の方法で使用することをお勧めします(disabled 属性に条件を付けます)。

<p:panel>                     
    <h:outputText value="Project Title"/>
    <p:inputText disabled="#{not projectBean.updateFlag}" 
        value="#{projectBean.selectedProjectDo.projectTitle}" />
    <p:commandButton disabled="#{not projectBean.updateFlag}" value="Update" 
        actionListener="#{projectBean.updateProject}" />
    <p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
</p:panel>

一般に、本当に必要な場合を除き、JSTLタグを使用しないでください...

于 2012-12-19T12:23:46.553 に答える