JSF - 将参数传递给valuechangelistener

11

我有一个类似于这样的小单选按钮:

<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函数。我需要在其中进行一些安排。

我该怎么做呢?

非常感谢您的帮助。

新手 Brad

2个回答

20
你可以使用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");

13

根据组件值的绑定方式,我猜测它应该在一个数据表格(datatable)里面。如果是这样,你可以使用DataModel#getRowData()方法获取当前行。你需要像下面这样在TestService bean中添加一个DataModel属性:

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

尽管如此,我建议使用比 TestServicetestchange() 更加合理的变量名,比如 QuestionairequestionchangeAnswer()。这样可以使代码更加自我描述。


你说得完全正确。那是一个数据表。你救了我的一周。谢谢英雄! - Tim Tuckle
那真的非常非常有帮助,BaluC!非常感谢! :) 我不知道还存在DataModel类这样的东西!!!这太有用了!对Brad的问题也点个赞。 - Niks
@Nikhil:不用谢。你可能也会发现这篇文章很有用:http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html 它包含了一个利用<h:dataTable>DataModel<E>@ViewScoped的CRUD示例。 - BalusC
这是一篇很棒的帖子!:) 再次感谢! - Niks
@BalusC:今天我在大约100个重要的JSF问题的答案中发现了你的名字 - 感谢你。 - Del Pedro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接