2012-08-12 7 views
6

Ich habe diese einfache Seite:Primefaces Datatable, verzögertes Laden und Befehl pro Zeile

<h:form id="form"> 

    <p:dataTable value="#{testBean.unitTypeModel}" var="elem" lazy="true" rows="10"> 
     <p:column headerText="class">#{elem.class.simpleName}</p:column> 
     <p:column headerText="code">#{elem.code}</p:column> 
     <p:column headerText="description">#{elem.description}</p:column> 
     <p:column headerText="action"> 
      <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit"> 
       <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/> 
      </p:commandButton> 
     </p:column> 
    </p:dataTable> 

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/> 

</h:form> 

und die CommandButton innerhalb DataTable nicht funktioniert, nur Seite aktualisiert. aber der eine draußen funktioniert.

wenn ich value und lazy diese Art und Weise zu ändern:

<h:form id="form"> 

    <p:dataTable value="#{testBean.unitTypeModel.load(0, 10, null, null, null)}" var="elem" lazy="false" rows="10"> 
     <p:column headerText="class">#{elem.class.simpleName}</p:column> 
     <p:column headerText="code">#{elem.code}</p:column> 
     <p:column headerText="description">#{elem.description}</p:column> 
     <p:column headerText="action"> 
      <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit"> 
       <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/> 
      </p:commandButton> 
     </p:column> 
    </p:dataTable> 

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/> 

</h:form> 

die CommanButton innerhalb DataTable funktioniert wie ein Zauber.

jemand weiß warum?

ist es ein Fehler?

ich bin auf

  • Glassfish 3.1.2
  • JSF 2.1.11 (Mojarra)
  • PrimeFaces 3.4-SNAPSHOT

Antwort

7

fand heraus, dass die faulen Datenmodell muss die gleiche Instanz auf Postback-Anfrage, auch eine neue Instanz mit den gleichen Werten wird nicht funktionieren. so muss es von mindestens einer @ViewScoped Bohne bereitgestellt werden.

+1

Das ist nicht ganz richtig: Es ist hilfreich, wenn die gleiche Instanz von 'LazyDataModel' in die gefunden wird Sitzung mit '@ ViewScoped', aber Sie können auch' @ RequestScoped' verwenden. Der Punkt ist, dass die Methode 'isRowAvailable()' True zurückgeben muss, wenn sie in 'APPLY_REQUEST_VALUES' ausgewertet wird und das Feld 'pageSize' einen Wert größer als Null enthalten muss. Ich habe dies erreicht, indem ich 'LazyDataModel' beim Überladen zweier Methoden erweitert habe:' isRowAvailable() ', hier lade ich' load (...) 'und verwende das Ergebnis auf' setWrappedData() 'und die zweite Methode' setRowIndex (int rowIndex) 'wo ich die' pageSize' auf meinen Standard setze – uvo

1

Vier Jahre sind vergangen, seit diese Frage gestellt wurde, aber das Problem bleibt weiterhin bei PrimeFaces 6.0.

Ich werde eine Problemumgehung für diejenigen bereitstellen, die ViewScoped-Beans nicht verwenden (oder nicht verwenden können).

Die Prämisse ist: "Sie können kein" ajaxified "-Element in einer faulen Datentabelle, die an RequestScoped-Objekte gebunden ist, platzieren". Noch nie. Bedenken Sie, dass alles, was einen Ajax-Anruf auslöst, niemals funktioniert.

Also ist der erste Schritt, den Ajax-Aufruf außerhalb der Datentabelle zu nehmen. Wir machen das mit einem RemoteComand. Sie können außerhalb des Datatable (innerhalb einer Form, natürlich)

<p:remoteCommand name="remoteCall" action="#{bean.doStuff()}"> 
</p:remoteCommand> 

nun diese Remotecommand überall platzieren, alles, was wir tun müssen, ist diese Remotecommand anrufen aus dem Inneren des Datatable. Ich verwende einen Link, um den JavaScript-Aufruf ausführen, aber man kann einen Knopf verwenden oder was auch immer Sie mögen:

<p:column> 
    <p:link value="#{item.id}" href="#" onclick="remoteCall([{name:'id', value:#{item.id}}])"> 
    </p:link> 
</p:column> 

Dieser Link bietet eine Möglichkeit, die JavaScript-Funktion „Remotecall“ zu nennen, die den Ajax-Aufruf zu werden führen "bean.doStuff()".

Beachten Sie, dass das onClick-Ereignis nicht nur den JavaScript-Aufruf an "remoteCall" enthält, sondern auch ein Parameterarray mit nur einem Parameter namens "id" mit dem Wert "# {item.id}". Dadurch kann der RemoteCommand einen Parameter namens "id" an die Backing-Bean senden.

Im Inneren des „doStuff“ Methode werden Sie haben die „id“ Parameterwert abzurufen:

public void doStuff() { 

    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"); 

} 
Verwandte Themen