2016-05-12 20 views
1

in meiner Seite, ich habe:Primefaces Paginate Faul Table ohne Zählung Reihe

    <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...> 
        <p:ajax event="page" oncomplete="myTable" /> 
        ... 
        </p:dataTable> 

in meiner Bohne:

    ... 
        private LazyDataModel list; 
        ...      
        public void search() { 
         list = new LazyDataModel<SomeDTO>() { 
          private static final long serialVersionUID = 1L; 
          List<SomeDTO> result = null; 

          @Override 
          public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {          
           List<SomeDTO> result = service.search(searchedName, first, pageSize); 
           // SOME CODE HERE FOR PAGINATION ?? BUT WHAT 
           return result; 
          } 

         }; 
         // HOW TO DELETE THIS EXTRA REQUEST 
         list.setRowCount(service.search(searchedName)); 
        } 

meine Frage ist, wie aus dem Ergebnis setRowCount (Größe + 1). Ich möchte nicht die Zählung von DB erhalten, weil ich sicher bin, dass wir den rowCount berechnen können, ohne DB anzurufen.

Antwort

-1

Ok ich habe es. zuerst auf Ihrer Seite müssen Sie dies:

      @Override 
          public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {          
           List<SomeDTO> result = service.search(searchedName, first, pageSize); 
           if (first <= pageSize) { 
            this.setRowCount(this.getRowCount() + result.size() + 1); 
           } else if (result != null && result.size() > 0 && (result.size() >= pageSize)) { 
            this.setRowCount(this.getRowCount() + result.size()); 
           } 
           return result; 
          } 
+0

Dies aktualisiert die Datentabelle. zweimal. Die Abfragen werden zweimal ausgeführt, um ... Nicht etwas, was Sie wollen, denke ich. – Kukeltje

+0

nein Herr ho wissen alles, lesen Sie das Problem und die Lösung vor der Beurteilung Personen.Apparately Sie wissen nicht, Primzahlen Datatable faulen Lidoading und wie es funktioniert !! –

+0

Als erstes beurteile ich keine Personen, ich beurteile die Antworten. Obwohl es technisch funktionieren könnte, ist es keine effiziente Lösung und wird nicht benötigt. Bemerkenswert, dass Sie über das Lesen von Antworten sagen. ** Ich bin derjenige, der den 'akzeptierten' PrimeFaces-Patch erstellt hat, auf den ich in meiner Antwort hingewiesen habe. ** Ich habe mehrere weitere Verbesserungen für die Datentabelle PrimeFaces in den Foren und älteren issuelists vorgeschlagen, einschließlich eines über darin eingebetteten Datatables eine Wiederholung. Ich habe die Arbeiten lange in meiner Umgebung, so ** ** ** faule Laden **. Also bitte die Unterlagen vor der Beurteilung der Personen ** ** – Kukeltje

-1

Primefaces Paginierung Faule Datatable-Abfragen notwendig, zwei, eine Abfrage, um die Ergebnisse einer Seite zurückzukehren:

    <p:remoteCommand name="updateMyTable" update="#{p:component('myTable')}" process="@this" /> 
        <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...> 
        <p:ajax event="page" oncomplete="updateMyTable()" /> 
        ... 
        </p:dataTable> 

in Ihrem Bean die Last Methode wie folgt ändern als begrenzend und eine weitere Abfrage, um die Gesamtgröße der Daten zu kennen.

+1

die zwei Abfragen sind nicht erforderlich, können wir die Anzahl der Seiten berechnen dynamisch von der Größe der zurückgegebenen Liste von unserem Service + 1, der Vorteil dieser Lösung ist, müssen wir nicht die Service-Methode, um die Zählung von db, vor allem für eine sehr komplexe Suchanfragen zu erhalten. –

2

PrimeFaces unterstützt dies nicht von Anfang an. A fix has been checked in to trunk on Feb 11th 2016, tagged 6.0 (so sollte es zumindest in den aktuellen 6.0RCx-Versionen sein). Ich bin mir nicht sicher, ob es in der Elite-Version> = 5.2.20 oder> = 5.3.7 (vom 12. Februar)

Ein wichtiger Grund dafür ist, dass die aktualisierte rowCount Sie in der Last tun können Methode serverseitig ist nicht auf die Paginator-Client-Seite angewendet. Da es jedoch vom Server an den Client übertragen wird, können Sie es bei der vollständigen Ausführung jedes Ajax-Aufrufs aktualisieren. In der Tat ist das ein großer Teil der patch (der andere Teil liest den Wert aus der Ajax-Antwort).

Kombiniert das Aufrufen dieses in z.B. die onComplete einer Ajax-Seite Veranstaltung wird das Problem lösen:

function updatePaginator(xhr, status, args) { 
    var paginator = PF('DataTableWidgetVar').paginator; 
    paginator.cfg.rowCount=args.totalRecords; 
    paginator.cfg.pageCount = Math.ceil(value/paginator.cfg/rows)||1; 
    paginator.updateUI(); 
} 

Sie können dann in jedem Aufruf in der Load-Methode, - Versuchen Seitengrße + 1 Datensätze zu lesen - Sie können die Anzahl auf diese Option, wenn Sie lesen können pageSize + 1 (aber pageSize-Datensätze immer noch zurückgeben) - Legen Sie die Anzahl auf die Anzahl der gelesenen Zeilen fest, wenn sie pageSize oder kleiner sind.

+0

Wenn Sie nach meiner Lösung suchen, habe ich: Dieser Befehl öffnet die Datentabelle nach der AJAX-Seite neu . Ich habe es getestet und es funktioniert perfekt. Wenn Sie nicht sicher in Ihrer Antwort sind, posten Sie es nicht. –

+0

gibt es tow Anfragen eins für p: ajax Seitenereignis und anderes für p: remoteCommand. Aber das ist kein Problem. Mein Problem besteht darin, zu vermeiden, dass die Datenbank angefordert wird, um die Zählzeile nicht datatabel zu bekommen. –

+0

das ist ein anderes Problem mit p: remoteCommand die Ladung der Datentabelle wird zweimal ausgeführt .. wissen Sie, wie die Datentabelle ohne p aktualisieren: remoteCommand ich habe versucht update = "datatable" aber nicht arbeiten? –