【问题标题】:How can I switch between two ui:compositions in a Facelets file?如何在 Facelets 文件中的两个 ui:compositions 之间切换?
【发布时间】:2018-07-27 17:53:59
【问题描述】:

在 JSF xhtml 文件中,我希望能够根据某些标志在两个不同的 ui:compositions 之间进行选择。下面使用虚构的magic:if 标签对此进行了说明。我怎样才能做到这一点?换句话说,我可以用什么真正的标签代替magic:if

<magic:if test="showOption1">
  <ui:composition template="/option1.xhtml">
    <ui:define name="header">Foo</ui:define>
  </ui:composition>
</magic:if>

<magic:if test="!showOption1">
  <ui:composition template="/option2.xhtml">
    <ui:define name="header">Foo</ui:define>
  </ui:composition>
</magic:if>

【问题讨论】:

    标签: jsf facelets


    【解决方案1】:

    换句话说,我可以使用什么真正的标签来代替magic:if?

    没有。 &lt;ui:composition&gt; 是根元素。没有什么比这更高了。

    你有两个选择:

    1. template 属性本身中进行切换。

      <ui:composition template="/option#{showOption1 ? 1 : 2}.xhtml">
          <ui:define name="header">Foo</ui:define>
      </ui:composition>
      
    2. &lt;ui:composition&gt; 中使用&lt;ui:decorate&gt;,这个可以用&lt;c:if&gt; 包裹。

      <ui:composition template="/options.xhtml">
          <c:if test="#{showOption1}">
              <ui:decorate template="/option1.xhtml">
                  <ui:define name="header">Foo</ui:define>
              </ui:decorate>
          </c:if>
          <c:if test="#{not showOption1}">
              <ui:decorate template="/option2.xhtml">
                  <ui:define name="header">Foo</ui:define>
              </ui:decorate>
          </c:if>
      </ui:composition>
      

    【讨论】:

    • c:if 内部使用ui:decorate 的方法对我有用。谢谢!这让我意识到我也可以只使用包裹在c:if 中的ui:include,这就是我最终要做的。
    • &lt;ui:include&gt; 不支持&lt;ui:define&gt;,所以那肯定是一个非常不同的组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多