1

我认为我被迫使用非常旧的 MyFaces 2.0.5 版本,并且动态包含与 EL 会导致很多问题,所以我切换到静态包含与 ui:fragment

<ui:fragment rendered="#{filtersPopup.filterFileName == 'checkBoxFilters'}">
    checkBoxFilters
    <ui:include src="/analytics/checkBoxFilters.xhtml" rendered="#{filtersPopup.filter != null}"/>
</ui:fragment>
<ui:fragment rendered="#{filtersPopup.filterFileName == 'DateRelativeFilter'}">
    DateRelativeFilter
    <ui:include src="/analytics/DateRelativeFilter.xhtml" rendered="#{filtersPopup.filter != null}"/>
</ui:fragment>
<ui:fragment rendered="#{filtersPopup.filterFileName == 'listboxFilter'}">
    listboxFilter
    <ui:include src="/analytics/listboxFilter.xhtml" rendered="#{filtersPopup.filter != null}"/>
</ui:fragment>

有了这个,它仍然抱怨重复的 id,因为我在这些源文件的几个上使用了相同的 id。所以看起来即使rendered应该是false,它仍然可以进入组件树。但是重复的 id 很好。我可以很容易地解决这个问题,所以现在当我提交表单时,我得到了这个异常

 /analytics/checkBoxFilters.xhtml at line 24 and column 118 value="#{filtersPopup.filter.groups}": Property 'groups' not found on type ListBoxFilter

所以你可以从异常中看到,它ListBoxFilter是我想要的对象,所以只包含 ListBoxFilter.xhtml,但正在被访问,checkBoxFilters.xhtml因此出现错误。知道如何解决这个问题吗?

4

1 回答 1

10

<ui:include>不从延伸UIComponent。它是一个标签处理程序。因此它根本不支持该rendered属性。它也没有在标签文档中列出。

<ui:fragment>确实是一个UIComponent。所以基本上你最终会在视图构建期间包含所有这 3 个包含文件,因此所有 3 个文件最终都在 JSF 组件树中。它只是通过有条件地呈现的 HTML 输出<ui:fragment rendered>。您仍然会从这些包含中得到重复的组件 ID,因为它们最终都在 JSF 组件树中。

您应该使用标记处理程序<c:if>而不是<ui:fragment>有条件地构建 JSF 组件树。

因此,从理论上讲,这应该适用于它们中的每一个:

<c:if test="#{filtersPopup.filterFileName == 'checkBoxFilters'}">
    checkBoxFilters
    <c:if test="#{filtersPopup.filter != null}">
        <ui:include src="/analytics/checkBoxFilters.xhtml" />
    </c:if>
</c:if>

... etc

#{filtersPopup}然而,当是视图范围的 bean 和/或当您使用时,这有一些警告<f:viewParam>

  1. 这需要最低 Mojarra 2.1.18,否则 JSF 视图范围 bean 将无法恢复。

  2. Taghandlers 在视图构建期间运行。因此,此后运行的事情<f:viewParam>根本不起作用。您需要回退到通过ExternalContext.

也可以看看:

于 2013-07-30T12:14:14.143 回答