0

我有由Ajax调用填充的PrimeFaces 数据表。

当我单击列标题以对其值进行排序时,这些值会消失。

<p:commandButton value="Pesquisar" actionListener="#{requestController.listRequests}" update="dataTable" />

这是我的看法:

<p:dataTable id="dataTable" var="order" value="#{requestController.backing.requestsList}"
                         paginator="true" rows="10"
                         paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}">
                <p:column sortBy="#{order.companyRequest}">
                    <f:facet name="header">
                        <h:outputText value="Pedido" />
                    </f:facet>
                    <h:outputText value="#{order.companyRequest}" />
                </p:column>

                <p:column sortBy="#{order.company.companyName}">
                    <f:facet name="header">
                        <h:outputText value="Cliente" />
                    </f:facet>
                    <h:outputText value="#{order.company.companyName}" />
                </p:column>

                <p:column sortBy="#{order.emissionDate}">
                    <f:facet name="header">
                        <h:outputText value="Data" />
                    </f:facet>
                    <h:outputText value="#{order.emissionDate}">
                        <f:convertDateTime pattern="dd/MM/yyyy"/>
                    </h:outputText>
                </p:column>
                <p:column sortBy="#{order.requestSituation.description}">
                    <f:facet name="header">
                        <h:outputText value="Status" />
                    </f:facet>
                    <h:outputText value="#{order.requestSituation.description}" />
                </p:column>
                <p:column>
                    <f:facet name="header">
                    </f:facet>
                    <h:form>
                        <h:commandLink value="Detalhes"/>
                    </h:form>
                </p:column>
            </p:dataTable>

编辑

请求控制器

@ManagedBean
@RequestScoped
public class RequestController implements Serializable
{

    private RequestBacking backing;

    public RequestController()
    {
        backing = new RequestBacking();
    }

    public void changeEventListener(ValueChangeEvent e)
    {
        backing.requestSearchType = e.getNewValue().toString();
    }

    public void change()
    {
        switch (backing.requestSearchType)
        {
            case "data":
                backing.mask = "99/99/9999";
                backing.maskSize = "10";
                break;
            case "cnpj":
                backing.mask = " 99.999.999/9999-99";
                backing.maskSize = "20";
                break;
            default:
                backing.mask = "";
                backing.maskSize = "50";
        }
    }

    public void listRequests() throws ParseException
    {

        CompanyVO companyVO = new CompanyVO();
        switch (backing.requestSearchType)
        {
            case "cnpj":
                companyVO.setCnpj(backing.requestSearchValue);
                break;
            case "cliente":
                companyVO.setCompanyName(backing.requestSearchValue);
                break;
            case "pedido":
                backing.requestVO.setCompanyRequest(Integer.parseInt(backing.requestSearchType));
                break;
        }
        SupplierVO supplierVO = new Support().getUserSession().getSupplier();
        backing.requestVO.setEmissionDate(new Support().convertDate(backing.requestSearchValue));
        backing.requestVO.setSupplier(supplierVO);
        backing.requestVO.setCompany(companyVO);

        backing.requestsList = new ArrayList<>(backing.getBo().getRequest(backing.requestVO));

        if (backing.requestsList.isEmpty())
        {
            FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_WARN, "Nenhum registro encontrado!", null);
            FacesContext.getCurrentInstance().addMessage(null, facesMessage);
            backing.requestsList = null;
        }
    }

..backing getter and setter
}

requestsListRequestBacking我所有的 getter 和 setter 上,如果有更好的方法,请纠正我,我正在使用它,因为它让我的控制器更干净。

public List<RequestVO> requestsList;
4

1 回答 1

1

显然,value="#{requestController.backing.requestsList}"它没有返回与初始请求相同的值。如果它是一个请求范围的 bean 和/或如果requestsList基于基于请求的变量在每个请求上填充它,就会发生这种情况。

这只是一个设计错误。将托管 bean 放在视图范围内,并确保您没有在 getter 方法中执行任何业务逻辑。嵌套类backing也是可疑的,或者它一定是一个糟糕的命名。

也可以看看:


简而言之,您的 bean 应该如下所示:

@ManagedBean
@ViewScoped
public class Orders {

    private String query; // +getter +setter
    private List<Order> results; // +getter (no setter required)

    @EJB
    private OrderService service;

    public void search() {
        results = service.search(query);
    }

    // Add/generate normal getters/setters (don't change them!)
}

你的视图应该是这样的:

<h:form>
    <p:inputText value="#{orders.query}" />
    <p:commandButton value="Search" action="#{orders.search}" update=":tableForm" />
</h:form>
<h:form id="tableForm">
    <p:dataTable value="#{orders.results}" var="order" ... rendered="#{not empty orders.results}">
        ...
    </p:dataTable>
    <h:outputText value="No results found" rendered="#{facesContext.postback and empty orders.results}" />
</h:form>
于 2012-05-22T19:00:51.993 回答