web-dev-qa-db-fra.com

Le tri ne fonctionne pas dans les données dans PrimeFaces?

Le tri ne fonctionne pas dans datatable dans PrimeFaces. Veuillez suggérer.

Voir ci-dessous mon fichier .xhtml

<h:form>

  <p:dataTable style="width: 60%" id="dt1" value="#{bean.list}" var="entry" first="0" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" >

    <f:facet name="header">
      <h2>Cars View</h2>
    </f:facet>

    <p:column sortBy="#{entry.carno}" filterBy="#{entry.carno}">
      <f:facet name="header">
        <h:outputText value="Car Number" />
      </f:facet>
      <h:outputText value="#{entry.carno}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings['car-model']}" filterBy="#{entry.carsettings['car-model']}">
      <f:facet name="header">
        <h:outputText value="Car Model"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings['car-model']}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings.year}" filterBy="#{entry.carsettings.year}">
      <f:facet name="header">
        <h:outputText value="Car Year"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings.year}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings.color}" filterBy="#{entry.carsettings.color}">
      <f:facet name="header">
        <h:outputText value="Car Color"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings.color}"></h:outputText>
    </p:column>
  </p:dataTable>
</h:form>

@Sean

Regardez ci-dessous le code

Liste de voitures

    <ui:composition template="/template.xhtml">
        <ui:define name="content">
            <f:view>
                <f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>
                <center>
                    <h1>Car View</h1>
                    <h:outputText value="No data found" style="font-size: 15px;font-family: Arial, Verdana,Helvetica, sans-serif" rendered="#{MyBackingBean.noDataExist}"></h:outputText>
                    <h:form id="dataform1">
                        <p:dataTable var="item" value="#{MyBackingBean.dataList}" dynamic="true" paginator="true" rows="2" id="table"  style="width:60%"
                                     rendered="#{!MyBackingBean.noDataExist}" >
                            <p:column sortBy="#{item.id}" filterBy="#{item.id}">
                                <f:facet name="header">
                                    <h:outputText value="ID" />
                                </f:facet>
                                <h:outputText value="#{item.id}" />
                            </p:column>
                            <p:column sortBy="#{item.carsettings['car-color']}" filterBy="#{item.carsettings['car-color']}">
                                <f:facet name="header">
                                    <h:outputText value="Color" />
                                </f:facet>
                                <h:outputLink target="_blank" value="http://#{item.carsettings['car-color']}">
                                    <h:outputText value="#{item.carsettings['car-color']}" />
                                </h:outputLink>
                            </p:column>
                            <p:column sortBy="#{item.carsettings.model}" filterBy="#{item.carsettings.model}">
                                <f:facet name="header">
                                    <h:outputText value="Model" />
                                </f:facet>
                                <h:outputText value="#{item.carsettings.model}" />
                            </p:column>
                            <p:column sortBy="#{item.carsettings.manufacturer}" filterBy="#{item.carsettings.manufacturer}">
                                <f:facet name="header">
                                    <h:outputText value="Manufacturer" />
                                </f:facet>
                                <h:outputText value="#{item.carsettings.manufacturer}" />
                            </p:column>
                        </p:dataTable>
                    </h:form>
                </center>
            </f:view>
        </ui:define>
    </ui:composition>
</h:body>

Le tri ne fonctionne pas dans le code ci-dessus

S'il vous plaît aider

15
user617966

Le haricot de support de primefaces (ViewScoped!) Doit contenir sa propre liste de lignes. Ainsi, par exemple, si vous interrogez la base de données chaque fois que vous demandez le p:dataTable:value, le tri ne fonctionnera pas.

Solution: collectez la liste dans la base de données et conservez-la dans une variable de liste locale dans le bean de support.

public List<Row> getDataTable() {
    if (tableDataList == null)
        tableDataList = loadListOnce();
    return tableDataList;
}
40
alfonx

Le problème est:

<f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>

Le tri est effectué en fonction du <p:dataTable/> en PhaseId.APPLY_REQUEST_VALUES de la liste. Le <f:event type"preRenderView"/> vous permet de recharger la liste en PhaseId.RENDER_RESPONSE et vous avez donc perdu le tri. 

Solution: utiliser <f:event type="postAddToView"/>

<f:event type="postAddToView" listener="#{MyBackingBean.load}" />

Cela rechargera la liste dans PhaseId.RESTORE_VIEW avant que le tri soit effectué par <p:dataTable/>

Testé avec PrimeFaces Version 3.1.1 et Mojarra 2.1.8

10
Sascha Groß

Si vous remplissez votre table dans le tri du getter, cela ne fonctionnera pas (comme décrit ci-dessus). Vous devriez mettre dans votre getter de la manière suivante:

public List<Row> getTableData() {
    if (tableDataList == null)
        tableDataList = dao.getTableData();
    return tableDataList;
}

Vous pouvez ensuite réinitialiser (actualiser) votre "argent" en punting tableDataList = null; si vous ne voulez pas que votre datatabele soit rafraîchi.

5
bkomac

Mon service avait:

public List<PlayerEntity> getAllPlayers() {
    return playerDao.readAll();
}

mais c'était faux, parce que quand j'appelais getAllPlayers () depuis la table

<p:dataTable id="data" value="#{myBean.allPlayers}"/>

DAO a rafraîchi les données mais je n’ai toujours pas ordonné. Au lieu de cela, j'ai créé le champ Liste et la méthode pour mettre à jour la liste 

private List<PlayerEntity> allPlayers = new ArrayList<PlayerEntity>();  

public void updateAllPlayers(){
    this.allPlayers = playerDao.readAll();
}

quelle méthode je cours sur l'initialisation de haricot

public void setPlayerDao(PlayerDao playerDao) {
    this.playerDao = playerDao;
    updateAllPlayers();
}

et après ajouter, supprimer ou modifier la liste

public boolean createPlayer(PlayerEntity playerEntity) {
    (...)
    updateAllPlayers();
    return true;
}

Maintenant, mon service a

public List<PlayerEntity> getAllPlayers() {
    return this.allPlayers;
}

et cela a résolu mon problème avec le tri des données dans la table Primefaces.

1
Pawel Miechowiecki

J'ai eu un problème de tri lorsque mon bean de sauvegarde était sessionScoped. Vous ne savez pas exactement quel est votre problème, mais si vous appuyez sur le bouton de tri et que rien ne se produit, essayez de modifier votre étendue en @ViewScoped. 

0
Sean

Je ne sais pas si c'est votre cas. Il y a un problème de primefaces. Un bug sur une sorte de datatable. Jetez un coup d’œil ici: https://code.google.com/archive/p/primefaces/issues/2476

Il existe quelques solutions de contournement:

  1. vous pouvez utiliser un lazyDataModel pour votre datatable, cela fonctionne.

  2. vous pouvez forcer l'ordre de tri. 

Dans votre datatable attraper l'événement de tri

<p:dataTable style="width: 60%" id="dt1" value="#{bean.list}" var="entry" first="0" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" >
<p:ajax event="sort" listener="#bean.sortListener}" />

Dans votre bean géré, vous définissez un ordre par chaîne à ajouter à votre requête.

private String orderBy = "";

public void sortListener(SortEvent event) {
    String orderColumn = event.getSortColumn().getValueExpression("sortBy").getExpressionString();

    //you will get the content of the attribute SortBy of the column you clicked on, like #{entry.carno}
    orderColumn = orderColumn.replace("#{entry.", "");
    orderColumn = orderColumn.replace("}", "");
    orderBy = " order by " + orderColumn + (event.isAscending()? " asc " : " desc ");
}

public List<Car> getList(){
    String query = "[...your query...]" + orderBy;
    ...[execute your query and get your ordered list]
}
0
LCanosa

avez-vous essayé @ SessionScoped? cela fonctionne bien pour moi, espérons cette aide.

0
Mythox