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">
也就是说,我建议使用比TestService
、test
和change()
更合理的变量名称,例如Questionaire
、question
和changeAnswer()
。这使代码更具自我记录性。
【讨论】:
你是绝对正确的。这是一个数据表。你救了我的一周。谢谢大侠! 这对 BaluC 非常有帮助!非常感谢! :) 我不知道存在像 DataModel 类这样的东西!!!这太有用了!布拉德的问题也是 +1。 @Nikhil:不客气。您可能会发现这篇文章也很有用:balusc.blogspot.com/2010/06/… 它包含一个使用<h:dataTable>
、DataModel<E>
和 @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 信号处理程序
如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数