【问题标题】:Primefaces dataTable instant Row Selection not workingPrimefaces dataTable即时行选择不起作用
【发布时间】:2013-08-05 15:43:49
【问题描述】:

我正在使用 Primefaces 3.5、Spring 3.2、JSF 2.2,而 Apache 是我的服务器。

我的问题是,每当我单击该行时,我的支持 bean 中永远不会触发行选择事件,并且我的商店详细信息面板永远不会更新。

我的支持 bean 在请求范围内并包含 onRowSelect 方法。 但是,当我将我的支持 bean 更改为会话范围时(它需要对支持 bean 进行一些更改),即时行选择有效。

为了简单起见,我修改了我的代码以仅包含相关部分。在我的参数中,为了测试,我只是将 ID 为 35 的现有客户放在我的测试页面中。

这是我的 dialog.xhtml

    <h:form id="customerListingsForm">

    <p:dialog id="manageStoresDialog"
            header="Manage #{manageStoreBean.store.owner.name}'s Stores"
            widgetVar="manageStoresDlg"
            modal="true"
            resizable="false">


        <p:panelGrid id="storePanel" rendered="#{manageStoreBean.owner != null}">
            <f:facet name="header">
                <p:row>
                    <p:column>Store Details</p:column>
                    <p:column>Customer Store List</p:column>
                </p:row>
            </f:facet>

            <p:row>
                <p:column>
                    <p:panelGrid id="storeDetails">         
                        <p:row>
                            <p:column>Name: </p:column>
                            <p:column>
                                <h:inputText value="#{manageStoreBean.store.name}" />
                            </p:column>
                        </p:row>

                        <p:row>
                            <p:column>Description: </p:column>
                            <p:column>
                                <h:inputText value="#{manageStoreBean.store.description}" />
                            </p:column>
                        </p:row>

                        <p:row>
                            <p:column>Short Code: </p:column>
                            <p:column>
                                <h:inputText value="#{manageStoreBean.store.shortCode}" />
                            </p:column>
                        </p:row>

                        <p:row>
                            <p:column>Owner name:</p:column>
                            <p:column>
                                <h:inputText value="#{manageStoreBean.store.owner.name}" readonly="true" />
                            </p:column>
                        </p:row>

                        <p:row>
                            <p:column>Store Type: </p:column>
                            <p:column>
                                <p:selectOneMenu
                                        id="storeTypeSelected"
                                        value="#{manageStoreBean.placeType}"
                                        var="storeType"
                                        style="height:25px"
                                        converter="#{placeTypeConverter}">
                                    <f:selectItems 
                                            value="#{manageStoreBean.typeList}"
                                            var="storeTypeItem"
                                            itemLabel="#{storeTypeItem.code}"
                                            itemValue="#{storeTypeItem}"/>
                                    <p:column>#{storeType.description}</p:column>
                                </p:selectOneMenu>
                            </p:column>
                        </p:row>

                        <p:row>
                            <p:column>Country: </p:column>
                            <p:column>
                                <p:selectOneMenu
                                        id="storeCountrySelected"
                                        value="#{manageStoreBean.country}"
                                        var="country"
                                        style="height:25px"
                                        converter="#{countryConverter}">
                                    <f:selectItems 
                                            value="#{manageStoreBean.countryList}"
                                            var="countryItem"
                                            itemLabel="#{countryItem.isoNumericCode}"
                                            itemValue="#{countryItem}"/>
                                    <p:column>#{country.isoNumericCode}</p:column>
                                </p:selectOneMenu>
                            </p:column>
                        </p:row>

                        <p:row>
                            <p:column>Localisation: </p:column>
                            <p:column>
                                <p:selectOneMenu
                                        id="storeLocalisationSelected"
                                        value="#{manageStoreBean.localisationData}"
                                        var="storeLocal"
                                        style="height:25px"
                                        converter="#{localisationConverter}">
                                    <f:selectItems 
                                            value="#{manageStoreBean.localisationList}"
                                            var="local"
                                            itemLabel="#{local.regionCode}"
                                            itemValue="#{local}"/>
                                    <p:column>#{storeLocal.id} - #{storeLocal.regionCode}</p:column>
                                </p:selectOneMenu>
                            </p:column>
                        </p:row>
                    </p:panelGrid>
                </p:column>

                <p:column style="width:250px">
                    <p:dataTable id="stores" 
                            var="store" 
                            value="#{manageStoreBean.storeList}" 
                            rowKey="#{store.id}"
                            scrollHeight="240"
                            scrollable="true"
                            selectionMode="single"
                            selection="#{manageStoreBean.selectedStore}"
                            lazy="true">

                        <p:ajax event="rowSelect" immediate="true" 
                                listener="#{manageStoreBean.onRowSelect}"
                                update=":customerListingsForm:storeDetails"/>

                        <p:column headerText="Salon Name">
                            <h:outputText value="#{store.name}" />
                        </p:column>
                        <p:column headerText="ID">
                            <h:outputText value="#{store.id}" />
                        </p:column>
                    </p:dataTable>
                </p:column>
            </p:row>
        </p:panelGrid>

        <p:commandButton 
                value="Save"
                action="#{manageStoreBean.saveStore}"
                oncomplete="manageStoresDlg.hide()">
                <f:param name="storeCustomerId" value="#{manageStoreBean.owner.id}" />
        </p:commandButton>

        <h:outputText value="&nbsp;&nbsp;&nbsp;" />

        <p:commandButton 
                value="Close" 
                oncomplete="manageStoresDlg.hide()"/>
    </p:dialog>


    <p:commandButton value="Add Store" 
            oncomplete="manageStoresDlg.show()"
            update=":customerListingsForm:manageStoresDialog"
            process="@this">
        <f:param name="storeCustomerId" value="35" />
    </p:commandButton>


</h:form>

我也是 primefaces 和 web 开发的新手,但在我开始这个项目之前,我自己做了很多学习。 我花了 2 天时间试图了解问题所在并搜索了所有网络但找不到任何解决方案。可能是我错过了什么或做错了不确定。

非常感谢任何帮助。

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    尝试使您的 bean 视图具有范围。

    如果您将其设置为请求范围,那么您就是在告诉 JSF 每次用户完成与您的服务器通信时丢弃所有现有数据。因此,让 JSF 在现有页面上运行侦听器是没有意义的。特别是,PrimeFaces 在遇到一组奇怪的范围时往往会出现故障。

    另见Difference between View and Request scope in managed beans

    【讨论】:

    • 我想过这一点,但如果我采用这种方式,我需要为 Spring 托管 bean 实现视图范围。但我想避免这种情况。另一方面,我有另一个与此类似的页面,它与请求范围 bean 完美配合。
    • 真的没有什么好的办法。您应该能够调用另一个会话(或应用程序)范围的 bean,但您会尝试将方形钉安装到圆孔中。如果您在请求范围的 bean 上运行 ajax 事件,那么调用该事件的唯一方法是它创建 一个全新的 bean,这意味着您不能引用任何数据。并且在空数据上调用行选择事件没有任何意义。
    • 是的,你是对的。如果我将客户 ID 放入 bean 构造函数中(为了测试),即时行选择会起作用,因为它知道如何再次重新加载表。所以我有点困惑?为什么需要重新加载表格才能进行选择?
    • 因为当您说它是请求范围的时,这就是您告诉它的行为方式。 :) 如果您进行请求范围的操作,服务器端代码将在完成每个单独的 HTTP 请求后立即删除它拥有的任何信息。尝试查看此流程: - 用户发出加载页面的请求(HTTP 请求) - 服务器完成了 HTTP 请求,因此它删除了 bean - 用户选择了一行。这将创建一个 AJAX 请求。 - 服务器创建一个新的 bean 来处理请求。这个 bean 没有来自第一个 bean 的任何信息。
    • 好的,我明白了。谢谢你帮我清理一些东西。我还在学习所有这些东西。无论如何我可以通过我的表传递参数,以便在对行选择执行新请求时它还包括(在我的情况下)客户 ID?
    【解决方案2】:

    通过在 Internet 上搜索很多东西,我得出的结论是,当使用动态参数加载表时,datatable 在请求范围内的支持 bean 不能很好地工作。这是非常耻辱。除了在 spring 中为我的 bean 实现 viewscope 之外,我没有看到任何其他选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2013-12-01
      • 2013-05-25
      • 1970-01-01
      • 2011-07-25
      相关资源
      最近更新 更多