【问题标题】:DataTable Order by column erase valuesDataTable 按列擦除值排序
【发布时间】:2012-05-29 07:28:39
【问题描述】:

我有一个由 Ajax 调用填充的 PrimeFaces dataTable

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

<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
}

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

public List<RequestVO> requestsList;

【问题讨论】:

    标签: ajax jsf datatable primefaces


    【解决方案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>
    

    【讨论】:

    • 当我点击一个列进行订购时,它再次发出请求?在这种情况下,requestsList 是基于用户通知的日期的搜索结果。在没有 ajax 的情况下完成了这项工作。
    • 它肯定会发出一个新请求。检查 HTTP 流量和服务器日志。
    • 将 bean 更改为 @ViewScoped 并且我的方法没有被调用,没有任何反应。 Ajax,在这种情况下仅适用于 @RequestScoped bean
    • 如果不查看支持 bean 逻辑,就很难判断。但是根据您之前问题中提供的支持 bean 代码,如果那篇误导性的 ICEfaces 文章再次导致另一个思维错误,我不会感到惊讶。
    • 不,这不是为此目的。你有一个设计错误。根据启动示例重写它。顺便说一句,您的changeEventListener 很奇怪。这似乎完全是多余的。
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多