Primefaces数据表在ajax更新后无法选择行

时间:2013-03-08 23:42:14

标签: jsf primefaces

我有一种我称之为奇怪的行为。

我有一个带有面板的页面,其中包含几个用于搜索目的的下拉菜单以及一个用于显示结果的数据表。 默认情况下,在加载页面时,值由PostContruct init()初始化。

我可以毫无问题地执行搜索,包括更新数据表。

现在,对我来说困难的部分如下: 我有一张打开/关闭状态的门票列表。我可以使用Open / Closed / ALL执行搜索。

  • 默认情况下,数据表仅加载了打开的票证,我可以选择它们并使用selectedRow值重定向到另一个页面。
  • 当我选择按关闭状态进行过滤并单击按钮进行搜索时,数据表会更新我可以选择行但是当我尝试打开任何页面时,我在bean中得到一个空指针异常。
  • 如果我选择all,数据表会更新,我可以选择行,但我只能打开包含第一页加载中显示的数据的页面,所以基本上只有处于打开状态的票证。那些处于封闭状态的我无法打开它们

我正在使用RequestScoped bean,我想知道一些问题,因为selectRow无法使用新添加的数据。

    <ui:define name="content">
        <h:form id="searchForm">
            <p:panelGrid id="searchPanel" style="width: 1000px" styleClass="ticketsPanel">
                <p:row>
                    <p:column>
                        <p:outputLabel for="lstStatus" value="Status"></p:outputLabel>
                    </p:column>
                    <p:column>
                        <p:selectOneMenu id="lstStatus" value="#{ticketController.searchStatus}">
                            <f:selectItem itemValue="Open" itemLabel="Open"></f:selectItem>
                            <f:selectItem itemValue="Closed" itemLabel="Closed"></f:selectItem>
                            <f:selectItem itemValue="ALL" itemLabel="ALL"></f:selectItem>
                        </p:selectOneMenu>
                    </p:column>
                    </p:row>
                <f:facet name="footer">
                    <p:row>
                        <p:column colspan="6" style="alignment-adjust: middle">
                            <p:commandButton value="Search" action="#{ticketController.search()}" update=":searchForm:lstTicketsTable"></p:commandButton>
                            <p:commandButton value="Create" action="/tickets/createticket.xhtml?faces-redirect=true"></p:commandButton>
                            <p:commandButton value="View" action="#{ticketController.doUpdateTicket()}"></p:commandButton>
                        </p:column>
                    </p:row>
                </f:facet>
            </p:panelGrid>

<p:dataTable id="lstTicketsTable" selectionMode="single" paginator="true"
                         paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {CurrentPageReport}  {RowsPerPageDropdown}"
                         rowsPerPageTemplate="10,15,50" rows="10" paginatorPosition="bottom"
                         value="#{ticketController.ticketList}" selection="#{ticketController.selectedTicket}" var="_tl" rowKey="#{_tl.number}">

                <p:column headerText="Ticket NR">
                    <p:outputLabel value="#{_tl.number}"></p:outputLabel>
                </p:column>
                <p:column headerText="Summary">
                    <p:outputLabel value="#{_tl.summary}"></p:outputLabel>
                </p:column>
                <p:column headerText="Contact From">
                    <p:outputLabel value="#{_tl.contactfrom}"></p:outputLabel>
                </p:column>
                <p:column headerText="Researcher">
                    <p:outputLabel value="#{_tl.researcher.email == null ? '' : _tl.researcher.email}"></p:outputLabel>
                </p:column>
                <p:column headerText="NSN SR">

                </p:column>
                <p:column headerText="SR / CR">

                </p:column>
                <p:column headerText="Release">
                    <p:outputLabel value="#{_tl.release}"></p:outputLabel>
                </p:column>
                <p:column headerText="Status">
                    <p:outputLabel value="#{_tl.status}"></p:outputLabel>
                </p:column>
                <p:column headerText="Age">
                    <p:outputLabel value="#{_tl.startdate}"></p:outputLabel>
                </p:column>
                <p:column headerText="Priority">
                    <p:outputLabel value="#{_tl.priority}"></p:outputLabel>
                </p:column>
            </p:dataTable>
        </h:form>
    </ui:define>

支持bean函数doUpdateTicket是在视图按钮中调用的函数,而搜索是更新数据表列表的函数。

public void doUpdateTicket() {
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();
    try {
        ec.redirect("/SupportSite/faces/tickets/updateticket.xhtml?tnr=" + this.selectedTicket.getNumber().toString());
    } catch (IOException ex) {
        Logger.getLogger(TicketController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void search() {
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();
    if (this.searchTicketNR != null) {
        Ticket t = tjc.findTicket(Integer.parseInt(this.searchTicketNR));
        if (t != null) {
            try {
               //This works when search by ticket number only
                ec.redirect("/SupportSite/faces/tickets/updateticket.xhtml?tnr=" + t.getNumber().toString()); 
            } catch (IOException ex) {
                Logger.getLogger(TicketController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    } else if (this.getSearchStatus() != "ALL") {
        setTicketList(tjc.findTicketByStatus(this.getSearchStatus()));
        this.init();
    } else {
        setTicketList(tjc.findTicketEntities());
        this.init();
    }
}

0 个答案:

没有答案