JSF-将参数传递给 valuechangelistener

Posted

技术标签:

【中文标题】JSF-将参数传递给 valuechangelistener【英文标题】:JSF- passing a parameter to valuechangelistener 【发布时间】:2011-04-26 15:52:13 【问题描述】:

我有一个像这样的小单选按钮:

<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函数。我需要在里面做一些安排。

我该怎么做?

非常感谢。

布拉德 - 新秀..

【问题讨论】:

【参考方案1】:

看到组件值是如何绑定的,我敢打赌它在数据表中。如果确实如此,您可以使用DataModel#getRowData() 获取当前行。将DataModel 属性添加到TestService bean,如下所示:

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()。这使代码更具自我记录性。

【讨论】:

你是绝对正确的。这是一个数据表。你救了我的一周。谢谢大侠! 这对 BaluC 非常有帮助!非常感谢! :) 我不知道存在像 DataModel 类这样的东西!!!这太有用了!布拉德的问题也是 +1。 @Nikhil:不客气。您可能会发现这篇文章也很有用:balusc.blogspot.com/2010/06/… 它包含一个使用 &lt;h:dataTable&gt;DataModel&lt;E&gt;@ViewScoped 的 CRUD 示例。 这篇文章很棒! :) 再次感谢! @BalusC:今天我在重要的 jsf 问题的大约 100 个答案中找到了你的名字——谢谢【参考方案2】:

您可以使用 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 是一个 Integer,那么您可以通过以下方式接收数据:

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

【讨论】:

以上是关于JSF-将参数传递给 valuechangelistener的主要内容,如果未能解决你的问题,请参考以下文章

将动态小部件对象传递给 QVariantAnimation valueChanged 信号处理程序

将额外参数传递给 f:ajax onevent 函数

在 JSF 1.2 中通过 EL 调用带参数的方法

如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数

如何将参数传递给 Java 线程?

如何将参数传递给进程