10
votes

P: DataTable perd que la colonne de tri et commande après Ajax Actualiser

J'ai un bouton sur une page qui provoque une actualisation de ma table de données via une demande AJAX. Quelque chose comme ceci:

<componentID>_sortDir
<componentID>_sortKey
<componentID>_sorting
<componentID>_updateBody


0 commentaires

8 Réponses :


3
votes

EDIT: strong>

Solution Publié ci-dessous (LazyTable) fonctionne pour le P: Datatable Stacked avec LazyDataModel. La méthode de la charge forte> la charge forte> est appelée après chaque mise à jour / rafraîchir sur la table souhaitée et gère le trier correctement. Le problème avec Simple P: DataTable est qu'il effectue un tri prédéfini uniquement sur la première charge ou après le clic sur la colonne de tri. C'est un comportement normal d'une table simple. P>

Alors, quelles sont vos possibilités pour une table simple: p>

  • Ne triez pas la table après la mise à jour, mais supprimez la colonne de tri afin que l'utilisateur final ne soit pas mal informé. Ajoutez ceci à votre écouteur d'action ou méthode d'action pour votre bouton de mise à jour: P> XXX PRE> LI>

  • Mettez à jour le type de table manuellement par script. Ce n'est pas la meilleure solution, mais les primesFaces ne fournissent aucune fonction côté client pour "recourir" de la table. Fondamentalement, vous savez qu'une seule colonne à la fois peut être triée et cette colonne a un .ui-état-actif. Vous pouvez l'utiliser dans un script et déclencher 2 clics sur cette colonne (1. Cliquez sur - Autre ordre de tri, 2. Cliquez - Retour à l'ordre de tri actuel). P>

    <h:form id="dataTableForm">
      <p:dataTable id="dataTableToUpdate">
        .
        .
        .
      </p:dataTable>
      <p:commandButton value="Refresh" update=":dataTableForm:dataTableToUpdate" />
    </h:form>
    


6 commentaires

Donc, le genre est maintenu pour vous? Ou est-ce que le bouton de tri vient d'en surbriller, mais le tri actuel est l'ordre de tri des objets en mémoire? J'ai essayé de mettre à jour le DT directement et que cela n'avait eu aucun effet sur le comportement pour moi.


Le bouton de tri est mis en surbrillance et le tri est effectué correctement. Les objets sont triés différemment de la mémoire - en fonction de l'ordre de tri actuel. Je l'ai essayé pour le scénario posté et cela fonctionne parfaitement pour moi. Quelle portée utilisez-vous pour le haricot de données?


J'ai édité la réponse, laissez-moi savoir si cela fonctionne pour vous.


Eh bien, l'option de table paresseuse ne semble pas fonctionner pour moi. Si je mettez à jour la table, le tri est réinitialisé. Je vais devoir tester l'autre option mais je suppose que cela fonctionnerait. Qu'est-ce que retirer le sortyby faire?


J'ai utilisé votre solution de jQuery et cela fonctionne bien. Les seules modifications que j'ai fabriquées sont les suivantes: Fonction RefreshSort (sélecteur) {jQuery (sélecteur) .Find ('. UI-State-actif.ui-Soyable-colu Mn'). Déclencheur ('click'); jQuery (sélecteur) .Find ('. Ui-State-actif.ui-tri-troisible-colu mn'). Trigger ('click'); } et dans le jeu de données:


@ Jedrus07 content que cela ait aidé quelqu'un.



0
votes

i Mettre en place un comparateur avec ma méthode de tostring () xxx

comparateur xxx


0 commentaires

0
votes

La solution consiste à avoir un haricot de conversation. Dans ce cas, le P: DataTable rafraîchit la table et ses entrées sans affecter l'ordre de tri. Dans le cas où vous avez AP: CommandButton sur chaque ligne, la rafraîchissement de la table fonctionne correctement aussi.

Le haricot de conversation: xxx

la page associée: < Pré> xxx


0 commentaires

5
votes

Tout d'abord, il existe un ticket ouvert sur le PremiersFaces Problème Tracker , qui cible cette question mais a récemment été étiqueté comme "ne corrigera pas".

Néanmoins, j'ai trouvé une bonne solution de contournement. Le tri des tables de qualité supérieure peut être déclenché en appelant une méthode JavaScript non documentée sur le widget de la DataTable. Ce qui suit pourrait ne pas fonctionner pour les versions ultérieures de la face principales, mais elle fait pour 3.4.2: p>

Ajoutez simplement ce qui suit à votre composant, qui déclenche la mise à jour: p>

<p:commandButton value="refresh" action="#{tableController.refreshPrices}" update="myTable" oncomplete="myTableWidget.sort($(PrimeFaces.escapeClientId('#{p:component('price')}')), 'ASCENDING')" />


1 commentaires

Dans le tri de la PF6.1 doit être un nombre: 1 / -1 pour "ascendance" / "décroissant".



10
votes

J'ai écrit une extension de la solution de @ TrueMmer. Ses révoyants l'ordre de tri retour à la valeur par défaut, où le mien reviendra à la trieuse précédente de l'utilisateur sélectionné. XXX PRE>

Mise à jour de la même table que les œuvres de TrueMmer comme ceci: P>

function postAjaxSortTable(datatable) {
    var selectedColumn = undefined;

    // multisort support
    if(datatable && datatable.cfg.multiSort) {
        if(datatable.sortMeta.length > 0) {
            var lastSort = datatable.sortMeta[datatable.sortMeta.length-1];
            selectedColumn = $(document.getElementById(lastSort.col));
        }
    } else {
        selectedColumn = datatable.jq.find('.ui-state-active');
    }

    // no sorting selected -> quit
    if(!selectedColumn || selectedColumn.length <= 0) {
        return;
    }

    var sortorder = selectedColumn.data('sortorder')||"DESCENDING";
    datatable.sort(selectedColumn, sortorder, datatable.cfg.multiSort);
}


9 commentaires

Belle solution. Je passerai bientôt à 3,5 et essayez d'essayer :) Il y a eu beaucoup de refactorisation pour les tables dans la version actuelle.


Je dois noter que je l'utilise à 3.4.2. Je ne sais pas si cela fonctionne très bien ou non en 3.5. *, Mais je doute que je vais encore passer.


Travaille toujours sous Primefaces 4.0 mais j'essaie de l'améliorer afin de gérer MultiSort


Je n'ai pas trouvé de moyen d'effectuer un "DataTable.sort (liste SeleyColumns, les trudiers de liste)" Pourtant, si quelqu'un le trouve, je serai tellement reconnaissant.


@ALVAROCACHOPERRO, ce problème aurait dû être corrigé dans 3.5.8 et 4.0. Voir code.google.com/p/primefaces/issues/detail?id = 3887 . N'est-ce pas?


@SRBS Aussi loin que j'ai compris Il existe de nombreuses façons de résoudre ce problème, l'article actuel, c'est une preuve de cela, mais toutes les solutions corrigent le problème de tri des colonnes. Mais mon problème c'est un peu différent parce que je veux restaurer la commande multicolumiée triée, je veux dire différentes colonnes sélectionnées dans un jeu de données, avec des commandes différentes chacune. Peut-être qu'il y a une solution, mais peut être mon manque de compétence me fait ne pas voir ou apprécier une solution que de résoudre ce problème. Quoi qu'il en soit, merci de votre intérêt. PD: Désolé pour la longue réponse.


@ALVAROCACHOPERRO, je viens de modifier le support multisort


@SRBS Comment appeleriez-vous la fonction JQuery après chaque fois que la page a été rafraîchie? (et pas en appuyant sur un bouton explicite)?


@ user3601872, appelez la fonction d'un script de connexion. Essayez dans Sinon, créez une nouvelle question.



0
votes

J'ai eu le même problème que vous. J'ai pu résoudre le problème à l'aide d'un LazyDatamodel . En raison de PremiersFays Issue avec l'index de la ligne , j'avais besoin de Ajoutez les utilitaires supplémentairesLazyMazyDatamodel (voir Index des lignes Commentaires): XXX PRE>

Puis utilisez votre LazyDatamodel Code> Classe avec ceci: p>

public class MyDataModel extends UtilitiesLazyDataModel<MyObjectClass>{

//override getRowData and getRowKey

}


0 commentaires

1
votes

Ajoutez ce phaselistener à votre application et le tri et le filtrage seront conservés après la mise à jour du type de données.

public class DataTableUpdatePhaseListener implements PhaseListener {

    private static final long serialVersionUID = 1L;

    @Override
    public void afterPhase(PhaseEvent event) {
        // Nothing to do here
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
        if (!facesContext.isPostback()) {
            return;
        }

        PartialViewContext partialViewContext = facesContext.getPartialViewContext();
        if (partialViewContext != null) {
            Collection<String> renderIds = partialViewContext.getRenderIds();

            for (String renderId : renderIds) {
                UIComponent component = facesContext.getViewRoot().findComponent(renderId);
                if (component instanceof DataTable) {
                    DataTable table = (DataTable) component;
                    if (!table.isLazy()) {
                        updateDataTable(table);
                    }
                }
            }
        }
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    private void updateDataTable(DataTable table) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (facesContext == null || table == null) {
            return;
        }

        // Reapply filtering
        if (!table.getFilters().isEmpty()) {
            FilterFeature filterFeature = new FilterFeature();
            filterFeature.decode(facesContext, table);
        } else {
            table.setFilteredValue(null);
        }

        // Reapply sorting
        ValueExpression tableSortByVE = table.getValueExpression("sortBy");
        if (tableSortByVE != null) {
            String tableSortByExpression = tableSortByVE.getExpressionString();

            // Loop on children, that are the columns, to find the one whose order must be applied.
            for (UIComponent child : table.getChildren()) {
                Column column = (Column) child;
                ValueExpression columnSortByVe = column.getValueExpression("sortBy");
                if (columnSortByVe != null) {
                    String columnSortByExpression = columnSortByVe.getExpressionString();

                    if (tableSortByExpression != null && tableSortByExpression.equals(columnSortByExpression)) {
                        // Now sort table content
                        SortFeature sortFeature = new SortFeature();
                        sortFeature.sort(facesContext, table, tableSortByVE,
                                SortOrder.valueOf(table.getSortOrder().toUpperCase(Locale.ENGLISH)),
                                table.getSortFunction());

                        break;
                    }
                }
            }
        }
    }
}


0 commentaires

0
votes

L'approche de @Rares Oltean pourrait également être mise en œuvre à l'aide d'auditeur d'événement de PRERENDERVIEW. Sur votre page JSF, inscrivez-vous à l'écoute: xxx

et mettez-le dans une gestionbean: xxx


0 commentaires