JSF - передача параметра в valuechangelistener - PullRequest
9 голосов
/ 17 октября 2010

У меня есть такая маленькая кнопка:

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

А мой слушатель такой:

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

Я хотел бы передать параметр методу changeanswer. Например, я хочу передать questionid в функцию changeanswer. Мне нужно договориться об этом.

Как я могу это сделать?

Заранее большое спасибо.

Брэд - Новичок ..

Ответы [ 2 ]

13 голосов
/ 16 декабря 2012

Вы можете использовать тег f: attribute для отправки любых данных в 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>

Если мы предполагаем, что questionId является целым числом, вы можете получить данные следующим образом:

public void changeanswer(ValueChangeEvent vcEvent) { 
  Integer questionId =
    (Integer) ((UIInput) vcEvent.getSource()).getAttributes().get("myattribute");
11 голосов
/ 18 октября 2010

Видя, как связаны значения компонентов, могу поспорить, что они внутри таблицы данных. Если это действительно так, вы можете использовать DataModel#getRowData() для получения текущей строки. Добавьте свойство DataModel к компоненту TestService следующим образом:

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

и измените вид следующим образом:

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

При этом я бы предложил использовать более разумные имена переменных, чем TestService, test и change(), например Questionaire, question и changeAnswer() соответственно. Это делает код более самодокументированным.

...