当在子标记中使用update属性时,Primefaces p:overlayPanel为空

时间:2018-03-12 14:21:30

标签: ajax primefaces xhtml

我想在数据表中显示一个键值对列表,其中每一对都是一行,位于叠加面板中。单击键值对时,我想更新<p:inputText> - 元素,该元素位于overlaypanel的外部,并带有所选行的键值,并同时关闭overlaypanel。

我刚刚从PF 4.0迁移到PF 6.1,现在我正面临这个问题,每当我在覆盖面板中使用update-attirbute时,它似乎是空的并且没有显示内容。

这是一个代码示例:

<p:inputText
        id="inputPvId"
        styleClass="form_input"
        readonly="true"
        value="#{bean.selectedValue.get(0)}" />
                <p:commandButton
                icon="ui-icon-link"
                id="selectValue"
                value="#{msg_properties.chooseValue}" />

                <p:overlayPanel
                        for="selectValue"
                        id="overlayValueSelector"
                        widgetVar="overlayValueSelector
                        dynamic="true"
                        styleClass="form_input_widest">

                        <p:dataTable
                                var="car"
                                value="#{dtBasicView.cars}">
                                        <p:column
                                               headerText="Id">
                                                      <h:outputText
                                                             value="#{car.id}" />
                                        </p:column>

                                        <p:column
                                               headerText="Year">
                                                      <h:outputText
                                                             value="#{car.year}" />
                                        </p:column>

                                        <p:ajax
                                               event="rowSelect"
                                               update=":form:inputPvId,:form:myTable"
                                               onsuccess="PF('overlayPV').hide()" />
                        </p:dataTable>

以前它的工作方式是这样的。我改变的是Widget从"overlayPV".hide()""PF('overlayPV').hide()"的调用方式,正如官方迁移指南所建议的那样。如果out取消了ajax调用中的update=":form:inputPvId,:form:myTable"行,则会正确显示内容。

我做错了吗?我的研究表明,其他人也遇到了overlaypanel和ajax更新的问题。但是,我找不到适合我的问题的解决方案。

我尝试使用“onRowClick” - 数据的属性以及widgetHide调用,如下所示:

<p:dataTable
        onRowClick="PF('overlayPV').hide()" /> 

它工作正常,但我无法弄清楚如何用选择的值更新<p:inputText> - 元素。我不得不刷新页面以显示新值。如果有人为此建议解决方案,我会很高兴。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我终于解决了这个问题。

我最初的问题是,只要<p:overlayPanel>中的元素包含&#34;更新&#34;属性,overlayPanel没有呈现任何内容并且显示为空。

我使用<p:remoteCommand> - 标签解决了我的问题,我将其放置在overlayPanel的OUTSIDE上,如下面的示例代码所示:

<p:inputText
        id="inputPvId"
        styleClass="form_input"
        readonly="true"
        value="#{bean.selectedValue.get(0)}" />
                <p:commandButton
                icon="ui-icon-link"
                id="selectValue"
                value="#{msg_properties.chooseValue}" />

                <p:overlayPanel
                        for="selectValue"
                        id="overlayValueSelector"
                        widgetVar="overlayValueSelector
                        dynamic="true"
                        styleClass="form_input_widest">

                        <p:dataTable
                                var="myTable"
                                value="#{dtBasicView.cars}"
                                onRowClick="remoteCommand()">
                                        <p:column
                                               headerText="Id">
                                                      <h:outputText
                                                             value="#{car.id}" />
                                        </p:column>

                                        <p:column
                                               headerText="Year">
                                                      <h:outputText
                                                             value="#{car.year}" />
                                        </p:column>

                        </p:dataTable>
                 </p:overlayPanel>
                 <p:remoteCommand
                                        name="remoteCommand"
                                        update="inputPvId, myTable"                                         
                                        onsuccess="PF('overlayPV').hide()"/>

请注意我的dataTable的onRowClick-Attribute,它在te overlayPanel之外调用remoteCommand。 remoteCommand比更新所有需要更新的元素,并关闭overlayPanel。