1

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

任何帮助深表感谢。

4

2 回答 2

1

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

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

另请参阅托管 bean 中视图和请求范围之间的区别

于 2013-08-05T02:18:12.813 回答
0

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

于 2013-08-05T21:36:07.267 回答