2013-03-06 14 views
14

Ho in una pagina due p:dataTable. Quello di sinistra è principalmente utilizzato per la selezioneComportamento strano di JSF p: dataTable (prima voce errata in p: colonne)

<p:dataTable id="leftTable" var="item" value="#{bean.items}" 
      selection="#{bean.item}" selectionMode="single"> 
    <p:ajax event="rowSelect" update=":rightTable" listener="#{bean.select}"/> 
    <p:column> 
    <h:outputText value="#{item.value}" /> 
    </p:column> 
</p:dataTable> 

Questo è abbastanza semplice e funziona bene. Il rightTable è una più complessa, questo è un esempio semplificato:

<p:dataTable id="rightTable" var="row" value="#{bean.rows}"> 
    <p:columns var="col" value="#{bean.cols}"> 
    <h:outputText value="#{bean.map[row.id][col.id]}"/> 
    </p:columns> 
</p:dataTable> 

Bene, questo funziona anche bene. Ora ho implementato uno composite component per sostituire la tabella sinistra. Questo componente ha anche gli attributi selection e select e, in generale, funziona anche. Viene chiamato lo stesso metodo come da p:dataTable e viene impostato anche il corretto.

Ma, e questa è davvero una brutta cosa: se io uso il mio componente personalizzato, sempre il valore nella prima cella (colonna 0, riga 0) è null. I valori sono presi da un Map<Long,Map<Long,String>> e ho verificato che il valore per lo specifico row.id,col.id sia impostato dopo che il metodo è stato chiamato.

Sono completamente priva di problemi con questo problema e mi aspetto che sia davvero difficile rispondere a questa domanda e apprezzo davvero se qualcuno può anche aiutarmi a risolvere il problema con in modo più dettagliato.

upate 1: Su richiesta ho controllato il #{row.id},#{col.id}:

95,626 | 95,528 
96,527 | 96,528 
97,527 | 97,528 

Nella prima cella della col.id è sbagliato. Dovrebbe essere 527 ma è effettivo 626 (è il valore della richiesta precedente). Perché succede? Come posso ottenere il valore corretto?

Update 2: Questa è la mia componente:

<composite:interface componentType="my.MenuDmClick"> 
    <composite:attribute name="actionListener" required="true" 
     method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)"/> 
    <composite:attribute name="selection"/> 
    <composite:attribute name="update/> 
    <composite:attribute name="dm"/> 
</composite:interface> 
<composite:implementation> 
    <ui:repeat var="item" value="#{cc.attrs.dm.wrappedData}"> 
    <li> 
    <p:commandLink actionListener="#{cc.actionListener(item)}" 
        update="#{cc.attrs.update}"> 
     <h:outputText value="#{item.name}"/> 
    </p:commandLink> 
    </li> 
    </ui:repeat> 
</composite:implementation> 

E questo è il backing bean:

@FacesComponent(value="my.MenuDmClick") 
public class MenuDmClick extends UINamingContainer 
{ 
    public void actionListener(Object ejb) 
    { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ValueExpression mSelection = this.getValueExpression("selection"); 

    if(mSelection!=null){mSelection.setValue(context.getELContext(), ejb);} 
    else{throw new PropertyNotFoundException("'selection' must be a ValueExpression!");} 

    MethodExpression ajaxEventListener = 
     (MethodExpression) getAttributes().get("actionListener"); 
    ajaxEventListener.invoke(context.getELContext(), new Object[] {}); 
    } 
} 
+0

Quando si utilizza selezionabili dataTable' si dovrebbe fornire '' rowKey' ad alcune proprietà unica del fagiolo modello, ad esempio può essere 'rowKey = "# {} item.value"'. Prova con questo e guarda cosa sta succedendo. – partlov

+0

Con il 'dataTable' selezionabile non ho problemi. Succede quando uso il mio composito: componente. Gli ID utilizzati (lunghi) sono unici. – Thor

+1

Aggiungere la stampa di # # {row.id}, # {col.id} 'vicino a' h: outputText' e vedere i valori come previsto. – partlov

risposta

0

Dopo aver provato la solita roba come

  • ui: repeat e c: forEach
  • immed iate = vero/falso

Mi sono imbattuto in [email protected] ... e funziona come un incantesimo!

<c:forEach var="item" items="#{cc.attrs.dm.wrappedData}"> 
    <li> 
    <p:commandLink process="@this" 
     actionListener="#{cc.actionListener(item)}" update="#{cc.attrs.update}"> 
     <h:outputText value="#{item.round.name}"/> 
    </p:commandLink> 
    </li> 
</c:forEach> 
Problemi correlati