2016-06-01 14 views
1

Ich muss eine Seite ständig mit neuen Daten aktualisieren, die von managedbeans erzeugt werden. Managedbean erstellt für alle paar Minuten eine neue Liste von Werten, und die Benutzeroberfläche muss für jeden Wert in der neu erstellten Liste nach "managedbean" einen Ausgabetext erstellen. Catch ist, die UI sollte die outputTexts behalten und neue für jede Anfrage hinzufügen, sie sollte alte outputTexts nicht aktualisieren/entfernen.Einen oder mehrere outputText der vorhandenen Seite dynamisch hinzufügen

Mein Code ist wie folgt - aktualisiert die gleichen outputText Felder für jeden Ajax Anruf, die ich wie oben erwähnt ändern muss.

<c:forEach var="data" items="#{myBean.dataList}"> 
    <p:fieldset legend="#{data}" toggleable="true" toggleSpeed="500"> 
     <h:panelGrid columns="2" cellpadding="5" border="0"> 
      <p:scrollPanel style="height:300px"> 
       <p:poll interval="2" listener="#{myBean.getDataList}" update="field1 field2"/> 
        <h:outputText value="#{data.field1}" id="field1"/> 
        <h:outputText value="#{data.field2}" id="field2"/> 
      </p:scrollPanel> 
     </h:panelGrid> 
    </p:fieldset> 
</c:forEach> 

so für jeden Ajax-Aufruf, kann es einige Datenelemente von managedbeans und für jedes dieses Artikel hergestellt werden soll ein neues output Feld sein.

Antwort

0

Sie können sie als ausgabe verwenden Datenliste für <h:outputText value="#{data.field1}" id="field1"/>

eine Liste erstellen und verwenden, ja müssen Sie einige CSS-Formatierung, weil Datalist CSS verwendet Standard. Beispielcode

<p:poll interval="3" listener="#{yourbean.yourmethod}" update="<updatecomponet>" /> 
<p:dataList value="#{yourbean.tempList}" var="s" id="updatecomponet"> 
     <p:outputLabel value="#{s}"></p:outputLabel> 
</p:dataList> 

Hinweis: Sie müssen Wert in der Liste hinzufügen, wenn Poll Call Listener. Es funktioniert in meinem Projekt, lassen Sie mich für etwas anderes wissen. Hoffe, das wird helfen.

+0

Aber ganze Datenliste wird für jeden Ajax-Call richtig aktualisiert? die die Leistung über einige hundert Datenelemente beeinträchtigen könnte. – user3366706

+0

Sie müssen die Ansicht aktualisieren, wenn Sie ein neues Ausgabekennzeichen hinzufügen müssen? Wenn nicht, ist es keine Möglichkeit, etwas Neues ohne Fire Update hinzuzufügen, für die Performance können Sie Datalist nur aktualisieren, wenn es benötigt wird, Sie können Back Bean einchecken und von Bean aktualisieren, wenn es benötigt wird. Wenn Sie irgendeine Lösung haben, lassen Sie es mich wissen, ich möchte auch die Lösung dafür. –

0

Vielleicht nicht die perfekte Lösung, aber Sie können eine DataTable mit Lazy Loading verwenden, die Poll-Komponente kann die Datatable-Seite aktualisieren und Sie müssen nicht eine große Anzahl von Komponenten aktualisieren.

Edit: xhtml

<p:dataTable var="v" 
    value="#{myBean.getLazyList}" 
    scrollRows="1" 
    liveScroll="true" 
    rows="20" 
    scrollHeight="300" 
    lazy="true" 
    scrollable="true" 
    id="tsUpdates"> 
      <p:column> 
        <h:outputText value="#{v.fields1}" /> 
      </p:column> 
</p:dataTable> 

Bean

public class Bean { 
    private LazyDataModel<MyClass> lazyList; 

    @Named("myBean") 
    @ViewScoped 

    @PostConstruct 
     public void init() { 
      lazyList = new LazyMyClassModel(); //where myList is your data source 
     } 

    //getters and setters  
} 

LazyModel

public class LazyMyClassModel extends LazyDataModel<MyClass>{ 
    private Integer findAllCount; 

    public LazyMyClassModel(){ 

    } 

    @Override 
    public List<MyClass> load(int first, int pageSize, String sortField, SortOrder sortOrder,Map<String, String> filters){ 
     List<MyClass> myList = //your live source of data 
     List<MyClass> data = new ArrayList<MyClass>(); 
     data = getSubList(MyList, first, pageSize) 

     if (findAllCount == null) { 
      findAllCount = myList.size 
      this.setRowCount(findAllCount); 
     } 
     return data 
    } 

    public List<MyClass> getSubList(List<MyClass> list, int fromIndex, int toIndex) { 
     int size = list.size(); 
     if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) { 
      return Collections.emptyList(); 
     } 
     fromIndex = Math.max(0, fromIndex); 
     toIndex = Math.min(size, toIndex); 
     return list.subList(fromIndex, toIndex); 
    } 
} 
+0

Können Sie mir bitte einen Überblick geben, wie es geht? – user3366706

+0

coz, habe ich den folgenden Weg versucht, ... – user3366706

+0

... Die Datenliste meiner Backing Bean wird Anfangs leer sein und nach einiger Zeit wird es anfangen, die Daten zu erzeugen ... also wird mit dem obigen Code die Tabelle nicht automatisch geladen, wenn der Datenwert irgendeinen Wert hat. Nach manueller Aktualisierung der Webseite scheint es einige Daten beim scollen zu laden, aber selbst das Laden hört irgendwann auf. Ich weiß nicht warum und ich konnte das Verhalten des Codes nicht klar verstehen. – user3366706

Verwandte Themen