2010-10-17 16 views
6

Ho un radiobutton litte come questo:JSF- passando un parametro per valuechangelistener

<h:selectOneRadio value="#{test.answer}" valueChangeListener="#{TestService.changeanswer}" immediate="true" id="answer"> 
<f:selectItem itemValue="A" itemLabel="Absolutely True"/> 
<f:selectItem itemValue="B" itemLabel="True"/> 
<f:selectItem itemValue="C" itemLabel="Partially True"/> 
<f:selectItem itemValue="D" itemLabel="Not True"/> 
<f:selectItem itemValue="E" itemLabel="Definitely Not True"/> 
<f:ajax event="change" process="answer"></f:ajax></h:selectOneRadio> 

E il mio ascoltatore è così:

public void changeanswer(ValueChangeEvent vcEvent) { 
System.out.println("comeon= " + vcEvent.getOldValue()); 
System.out.println("comeon= " + vcEvent.getNewValue());} 

vorrei passare un parametro al metodo changeanswer Ad esempio voglio passare il questionario alla funzione di cambio di valuta. Ho bisogno di organizzarmi.

Come posso farlo?

Molte molte grazie in anticipo.

Brad - il Rookie ..

risposta

10

Vedendo come i valori dei componenti sono tenuti, scommetto che è dentro un DataTable. In questo caso, è possibile utilizzare DataModel#getRowData() per ottenere la riga corrente. Aggiungere una proprietà DataModel al fagiolo TestService come segue:

private List<Question> questions; 
private DataModel<Question> questionModel; 

@PostConstruct 
public void init() { 
    questions = getItSomehow(); 
    questionModel = new ListDataModel<Question>(questions); 
} 

public void change(ValueChangeEvent event) { 
    Question currentQuestion = questionModel.getRowData(); 
    // ... 
} 

e modificare la visualizzazione nel modo seguente:

<h:dataTable value="#{TestService.questionModel}" var="test"> 

Detto questo, io suggerirei di usare i nomi delle variabili più sensibili rispetto TestService , test e change(), come Questionaire, question e changeAnswer() rispettivamente. Questo rende il codice più auto-documentante.

+0

Hai assolutamente ragione. Era un datatable. E hai salvato la mia settimana. Grazie eroe! –

+0

Prego. – BalusC

+0

Questo è stato un BaluC MOLTO MOLTO utile! Molte grazie! :) Non sapevo esistesse qualcosa come la classe DataModel !!! Questo è così utile! +1 per la domanda di Brad. – Nikhil

7

È possibile utilizzare la f: tag di attributo per inviare tutti i dati al ValueChangeListener:

<h:selectOneRadio value="#{test.answer}" 
        valueChangeListener="#{TestService.changeanswer}" 
        immediate="true" id="answer"> 
    <f:attribute name="myattribute" value="#{test.questionid}" /> 
    <f:selectItem itemValue="A" itemLabel="Absolutely True"/> 
    ... 
</h:selectOneRadio> 

Se supponiamo QuestionID è un numero intero, quindi è possibile ricevere i dati nel seguente modo:

public void changeanswer(ValueChangeEvent vcEvent) { 
    Integer questionId = 
    (Integer) ((UIInput) vcEvent.getSource()).getAttributes().get("myattribute"); 
Problemi correlati