2012-08-12 25 views
6

ho questa semplice pagina:primefaces DataTable, il caricamento pigro e CommandButton per riga

<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> 

e CommandButton all'interno DataTable non funziona, si aggiorna la pagina. ma quello esterno sta funzionando.

se cambio value e lazy in questo modo:

<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> 

il CommanButton all'interno DataTable funziona come un fascino.

qualcuno sa perché?

è un bug?

io sono sul

  • Glassfish 3.1.2
  • JSF 2.1.11 (Mojarra)
  • primefaces 3.4-snapshot

risposta

7

scoperto che il DataModel pigro deve essere il stessa istanza sulla richiesta postback, anche una nuova istanza con gli stessi valori non funzionerà. quindi deve essere fornito da almeno un bean @ViewScoped.

+1

Questo non è del tutto vero: è utile se la stessa istanza di 'LazyDataModel' si trova nel sessione con l'uso di '@ ViewScoped', ma puoi anche usare' @ RequestScoped'. Il punto è che il metodo 'isRowAvailable()' deve restituire true quando viene valutato in 'APPLY_REQUEST_VALUES' e il campo' pageSize' deve contenere un valore maggiore di zero. Ho raggiunto questo risultato estendendo 'LazyDataModel' mentre sovraccarico due metodi:' isRowAvailable() ', qui chiamo' load (...) 'e applichiamo il risultato a' setWrappedData() 'e il secondo metodo' setRowIndex (int rowIndex) 'dove ho impostato' pageSize' sul mio valore predefinito – uvo

1

Sono passati quattro anni da quando è stata inviata questa domanda, ma il problema rimane ancora in PrimeFaces 6.0.

Ho intenzione di inviare una soluzione alternativa a coloro che non vogliono (o non possono) utilizzare i bean ViewScoped.

La premessa è: "non è possibile posizionare alcun elemento" ajaxified "all'interno di un databile legato a materiale RequestScoped". Mai. Tieni presente che tutto ciò che lancia una chiamata Ajax non funzionerà mai.

Quindi il primo passo è prendere la chiamata ajax al di fuori del datatable. Lo faremo utilizzando un RemoteComand. È possibile inserire questo RemoteCommand ovunque al di fuori della DataTable (all'interno di un modulo, ovviamente)

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

Ora, tutto quello che dobbiamo fare è chiamare questa RemoteCommand dall'interno del DataTable. Sto usando un link per eseguire la chiamata JavaScript, ma si potrebbe utilizzare un pulsante o quello che vuoi:

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

Questo link fornisce un modo per chiamare la funzione javascript "RemoteCall" che eseguirà la chiamata Ajax per "bean.doStuff()".

Si noti che l'evento onClick contiene non solo la chiamata javascript a "remoteCall" ma contiene anche un array di parametri con un solo parametro, denominato "id" con un valore "# {item.id}". Ciò consentirà a RemoteCommand di inviare un parametro denominato "id" al bean di supporto.

All'interno del metodo "doStuff" si dovrà recuperare il "id" valore del parametro:

public void doStuff() { 

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

} 
Problemi correlati