2010-10-17 20 views
6

J'ai un RadioButton litte comme ceci:JSF- passer un paramètre à 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> 

Et mon auditeur est comme ça:

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

Je voudrais passer un paramètre à la méthode changeanswer .Par exemple, je veux passer le questionid à la fonction changeanswer. J'ai besoin de faire des arrangements.

Comment puis-je faire cela?

Beaucoup de nombreux merci à l'avance.

Brad - le Rookie ..

Répondre

10

voir comment les valeurs des composants sont liés, je parie que c'est dans un datatable. Si tel est le cas, vous pouvez utiliser DataModel#getRowData() pour obtenir la ligne en cours. Ajouter une propriété DataModel à la fève TestService comme suit:

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

et changer la vue comme suit:

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

Cela dit, je vous suggère d'utiliser des noms de variables plus sensibles que TestService , test et change(), comme Questionaire, question et changeAnswer() respectivement. Cela rend le code plus auto-documenté.

+0

Vous avez absolument raison. C'était un datatable. Et tu as sauvé ma semaine. Merci héros! –

+0

De rien. – BalusC

+0

C'était TRÈS TRÈS utile BaluC! Merci beaucoup! :) Je ne savais pas qu'il existe quelque chose comme classe DataModel !!! C'est tellement utile! +1 pour la question de Brad aussi. – Nikhil

7

Vous pouvez utiliser le f: balise d'attribut pour envoyer des données au 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 nous supposons QuestionID est un entier, vous pouvez recevoir les données de la manière suivante:

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