2010-10-17 6 views
6

ich ein litte RadioButton- wie dieses:vorbei JSF- ein Parameter 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> 

Und meine Zuhörer ist wie folgt aus:

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

Ich möchte einen Parameter an die changeanswer Methode zu übergeben Zum Beispiel möchte ich das Fragezeichen an die Changeanswer-Funktion übergeben. Ich muss einige Vorkehrungen treffen.

Wie kann ich das tun?

Vielen vielen vielen Dank im Voraus.

Brad - der Rookie ..

Antwort

10

Zu sehen, wie die Komponentenwerte gebunden sind, ich wette, dass es sich in einer Datentabelle ist. Wenn das tatsächlich der Fall ist, können Sie DataModel#getRowData() verwenden, um die aktuelle Zeile zu erhalten. Fügen Sie eine DataModel Eigenschaft auf die Bohne TestService wie folgt:

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

und die Ansicht ändern, wie folgt:

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

Das heißt, ich würde vorschlagen, empfindlicheren Variablennamen als TestService zu verwenden , test und change(), wie Questionaire, question bzw. changeAnswer(). Dies macht den Code selbstdokumentierender.

+0

Sie haben absolut Recht. Es war eine Datentabelle. Und du hast meine Woche gerettet. Danke Held! –

+0

Gern geschehen. – BalusC

+0

Das war SEHR SEHR hilfreich BaluC! Danke vielmals! :) Ich wusste nicht, dass es so etwas wie DataModel Klasse gibt !!! Das ist SO nützlich! +1 für Brad's Frage. – Nikhil

7

Sie die f verwenden können: Attribut-Tag keine Daten an die ValueChangeListener zu senden:

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

Wenn wir annehmen, QuestionID eine ganze Zahl ist, dann können Sie die Daten auf folgende Weise erhalten:

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