包含的内容呈现两次,即使它被渲染属性排除

时间:2015-05-12 13:12:43

标签: jsf primefaces facelets jsf-2.2

在primefaces对话框中,我首先显示一个带有一些输入字段的表单。如果用户单击按钮,则打开图像或pdf,并使用p:layout分隔对话框。为此,我在editProperty.xhtml中包含了输入字段的渲染,并在对话框中包含了两次。在panelGroup中,仅显示输入字段,也显示在p:layout内。我用panel属性排除了panelGroup和布局。所以我的期望是只有对话框显示布局或面板组。 初始UI显示没有p:布局,但字段呈现两次。

<o:form id="editPropertyFormId">
<p:dialog id="editPropertyDialogId" widgetVar="editPropertyDialogVar" modal="true">
    <!-- <c:if test="#{editPropertyContentBL.isContentViewerCollapsed() == false}"> -->
    <p:layout id="editPropertiesLayoutId" style="width: 100%; height: 100%;" onResize="adjustContentViewerSize();"
        widgetVar="editPropertiesLayoutVar" rendered="#{editPropertyContentBL.contentViewerCollapsed == false}">
        <p:layoutUnit id="editPropertiesFieldsLayoutId" position="west" resizable="true" size="400"
            style="padding-right: 5px !important;" collapsible="false">
            <ui:include src="/sections/edit/editProperty.xhtml">
                <ui:param name="idPrefix" value="editPropsInLayout" />
                <ui:param name="editPropertyBLInstance" value="#{editPropertyBL}" />
                <ui:param name="editPropertyContentBLInstance" value="#{editPropertyContentBL}" />
            </ui:include>
        </p:layoutUnit>
        <p:layoutUnit id="editPropertiesContentViewerLayoutId" position="center" resizable="true"
            styleClass="contentViewerLayout">
            <ui:include src="/sections/content/contentViewer.xhtml" />
        </p:layoutUnit>
        </p:layout>
        <!-- </c:if> -->

        <!-- <c:if test="#{editPropertyContentBL.isContentViewerCollapsed() == true}"> -->
        <h:panelGroup rendered="#{editPropertyContentBL.contentViewerCollapsed == true}">
            <ui:include src="/sections/edit/editProperty.xhtml">
                <ui:param name="idPrefix" value="editProps" />
                <ui:param name="editPropertyBLInstance" value="#{editPropertyBL}" />
                <ui:param name="editPropertyContentBLInstance" value="#{editPropertyContentBL}" />
                </ui:include>
        </h:panelGroup>
        <!-- </c:if> -->
</p:dialog>

如果我使用c:if(在代码中取消注释),似乎ui:参数不起作用,因为editProperty.xhtml中的更新不起作用:

<p:inputText id="#{idPrefix}editPropertyChoiceListValueId"...
<p:commandButton update="#{idPrefix}editPropertyChoiceListValueId"

我得到一个例外,找不到“editPropseditPropertyChoiceListValueId”。可能ui有问题:在c:if?

中包含/ ui:param

由于 奥利弗

1 个答案:

答案 0 :(得分:0)

两次渲染内容的问题是在包含的xhtml中数据绑定dataTable:

<h:dataTable binding="#{editPropertyMainTableBinding}"

我用它来获取当前行索引:

<ui:param name="curDummyCssClass" value="editPropertyChoiceDummyCssClass#{editPropertyMainTableBinding.rowIndex}" />

我消除了这个后,双重渲染消失了。 UI渲染似乎也快得多。 我还删除了“c:if test”和渲染的东西,将内容放在单独的xhtml文件中并包含它:

<ui:include src="#{editPropertyContentBL.contentViewerCollapsed == true ? '/sections/dialog/editPropertyDialogContent.xhtml' : '/sections/dialog/editPropertyWithContentViewerDialogContent.xhtml'}" />

我不认为这与双重渲染有关,但删除了不受欢迎的c:if标记。