2010-10-17 18 views
6

mam Litte RadioButton tak:JSF- przekazując parametr do 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> 

A mój słuchacz jest tak:

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

Chciałbym przekazać parametr do metody changeanswer Na przykład chcę przekazać questionid do funkcji changeanswer. Muszę w nim zawrzeć pewne ustalenia.

Jak mogę to zrobić?

Wiele wiele wiele z góry dzięki.

Brad - Rookie ..

Odpowiedz

10

Widząc jak wartości elementów są zobowiązane, założę się, że jest wewnątrz DataTable. Jeśli tak jest rzeczywiście, możesz użyć DataModel#getRowData(), aby uzyskać bieżący wiersz. Dodać obiekt DataModel do TestService fasoli jak następuje:

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

i zmienić widok następująco:

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

Powiedział, sugeruję użyć bardziej sensownych nazw zmiennych niż TestService , test i change(), jak Questionaire, question i changeAnswer() odpowiednio. To sprawia, że ​​kod jest bardziej samokomponowany.

+0

Masz całkowitą rację. To było datatable. I uratowałeś mój tydzień. Dzięki bohater! –

+0

Nie ma za co. – BalusC

+0

To było BARDZO bardzo pomocne BaluC! Wielkie dzięki! :) Nie wiedziałem, że istnieje coś takiego jak klasa DataModel !!! To jest TAK użyteczne! +1 także za pytanie Brada. – Nikhil

7

Można użyć f: tag atrybutu wysłać jakieś dane do 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> 

Jeśli założymy questionId jest liczbą całkowitą, to można odbierać dane w następujący sposób:

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