2

始める前に、この質問のタイトルの文言がわかりにくい場合はお詫び申し上げます。ここでの説明がより明確になることを願っています。

アプリケーションの JSF テンプレートに、別のテンプレートを含めて、アプリケーション メソッドの結果を保持するパラメータをそれに渡したいと考えています。この親テンプレートには、次のものがあります。

<ui:repeat var="loopObject" value="#{ApplicationBean.objectList}">
    <ui:include src="anotherTemplate.xhtml">
        <ui:param name="firstParam" 
            value="#{ApplicationBean.initForOtherTemplate(loopObject)}" />
    </ui:include>
</ui:repeat>

しかし、これinitForOtherTemplateはこの時点では実行されておらずfirstParam、予想どおり、その戻り値ではなく、そのメソッドへの参照が含まれていることがわかりました。

実際、 while にinitForOtherTemplateは戻り値がありますが、anotherTemplate.xhtml必要ありません。ただし、メソッドはApplicationBean、この新しいテンプレートが使用する他のいくつかのオブジェクトを設定します。たとえば、他のテンプレートが必要とするimportantInfoとの値を設定します。importantInfoToo

anotherTemplate.xhtml内容:

<ui:remove>
    <!-- 
    When a parameter contains a method call, the method isn't executed until
    the parameter is referenced.  So we reference the parameter here and ignore
    the results.  There must be a better way.
    -->
</ui:remove>
<h:outputText value="#{firstParam}" style="display: none;" />
<h:outputText value="#{ApplicationBean.importantInfo}" />
<h:outputText value="#{ApplicationBean.importantInfoToo}" />

このテンプレートが を参照していない場合firstParamimportantInfoandimportantInfoTooは設定されないか、予測できない値になります。initForOtherTemplateここではなく、親テンプレートで実行されることを期待していたので、これは非常に残念です。

メソッドへの参照を保存するのではなく、メソッドを実際にすぐに実行するようにパラメーターの割り当てを取得するにはどうすればよいですか?

4

1 に答える 1

3

これ<ui:repeat>は、UIComponentビューのレンダリング時に実行されます。これ<ui:include>TagHandler(JSTLのように)ビューのビルド時に実行されます。したがって、現時点では実行<ui:include>されていないため、ELスコープではまったく使用できません。<ui:repeat>#{loopObject}

で置き換えると、この特定の問題が解決<ui:repeat>するはずです。<c:forEach>

<c:forEach var="loopObject" items="#{ApplicationBean.objectList}">
    <ui:include src="anotherTemplate.xhtml">
        <ui:param name="firstParam" 
            value="#{ApplicationBean.initForOtherTemplate(loopObject)}" />
    </ui:include>
</c:forEach>

参照:

于 2012-08-03T20:33:58.180 に答える