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

3
我想在一个覆盖面板中展示一张键值对的列表,其中每个键值对为一行。当点击一个键值对时,我希望更新一个位于覆盖面板外部的<p:inputText>元素,并将所选行的键值同时关闭覆盖面板。
我刚从PF 4.0迁移到PF 6.1,现在遇到了一个问题:每当我在覆盖面板内使用update-attribute时,它似乎是空的,没有显示任何内容。
以下是一个代码示例:
<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>

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

我做错了什么吗?我的研究表明,其他人也遇到了覆盖面板和ajax更新的麻烦。然而,我没有找到适合我的问题的解决方案。

我尝试使用datatable的"onRowClick"属性与widgetHide调用,如下所示:

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

这段代码可以正常运行,但是我不知道如何更新所选值的 <p:inputText> 元素。我必须刷新页面才能显示新的值。如果有人能提供解决方法,我将不胜感激。谢谢。

1个回答

2

我终于解决了这个问题。

我的最初的问题是,每当<p:overlayPanel>内的元素包含“update”属性时,覆盖面板不会呈现任何内容并显示为空。

我通过<p:remoteCommand>标签解决了我的问题,如下面的示例代码所示,我将其放在覆盖面板之外:

<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()"/>

请注意,我的数据表的onRowClick属性调用了遮罩面板外部的remoteCommand。然后,remoteCommand会更新所有需要更新的元素,并关闭遮罩面板。请保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接