2010-10-17 26 views
6

Tengo un botón de radio podrían mejorarlo así:JSF- pasar un parámetro a 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> 

Y mi oyente es así:

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

me gustaría pasar un parámetro al método changeanswer .Por ejemplo, quiero pasar el questionid a la función changeanswer. Necesito hacer algunos arreglos en eso.

¿Cómo puedo hacer eso?

Muchas muchas muchas gracias de antemano.

Brad - el Novato ..

Respuesta

10

Al ver cómo se unen los valores de los componentes, apuesto a que hay dentro de una tabla de datos. Si ese es el caso, se puede utilizar DataModel#getRowData() para obtener la fila actual. Añadir una propiedad DataModel al bean TestService como sigue:

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(); 
    // ... 
} 

y cambiar la vista de la siguiente manera:

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

Dicho esto, me gustaría sugerir a utilizar los nombres de variable más sensible que TestService , test y change(), como Questionaire, question y changeAnswer() respectivamente. Esto hace que el código sea más autodocumentado.

+0

Tienes toda la razón. Fue una tabla de datos. Y salvaste mi semana. Gracias héroe! –

+0

De nada. – BalusC

+0

Eso fue muy, muy servicial BaluC! ¡Muchas gracias! :) ¡No sabía que existe algo así como la clase DataModel! ¡Esto es TAN útil! +1 para la pregunta de Brad también. – Nikhil

7

Puede utilizar el f: identificador de atributo para enviar los datos a la 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> 

Si suponemos IdPregunta es un entero, entonces usted puede recibir los datos de la siguiente manera:

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