【问题标题】:JSF- passing a parameter to valuechangelistenerJSF-将参数传递给 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函数。我需要在里面做一些安排。

我该怎么做?

非常感谢。

布拉德 - 新秀..

【问题讨论】:

    标签: jsf jsf-2 parameter-passing valuechangelistener


    【解决方案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");
    

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2012-12-03
      • 2018-06-05
      相关资源
      最近更新 更多