2010-10-17 88 views
6

我有一個豆蔻單選按鈕這樣的:JSF-將參數傳遞給valuechangelistener

<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函數。我需要做一些安排。

我該怎麼做?

很多很多很多很多,在此先感謝。

布拉德 - 新秀..

回答

10

看到的元件值如何綁定,我敢打賭,這是一個數據表中。如果確實如此,則可以使用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"> 

這麼說,我會建議使用更明智的變量名比TestServicetestchange(),分別如QuestionairequestionchangeAnswer()。這使得代碼更加自我記錄。

+0

你是對的。這是一個數據表。你救了我的一週。感謝英雄! – 2010-10-18 11:05:36

+0

不客氣。 – BalusC 2010-10-18 11:14:51

+0

這非常非常有幫助BaluC!非常感謝! :)我不知道存在像DataModel類的東西!這非常有用! +1也是Brad的問題。 – Nikhil 2011-04-07 12:43:25

7

可以使用F:屬性標記任何數據發送到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");