2012-09-14 45 views
0

我valuechangelistener方法不被稱爲我的預期。我有一個h:selectOneRadio組件(如下圖),我希望當我點擊添加按鈕的valueChangeListener被調用,但越來越只調用了add方法,該方法setSelectedItem被完全忽略。我錯過了什麼?注意javascript dataTableSelectOneRadio執行正常。ValueChangeListener沒有被調用時提交

這裏是.xhtml

h:panelGrid 
Select Client to Associate with Appointment 
<h:dataTable id="addClient" styleClass="dataTable" 
    value="#{AddEntryMB.clientValues}" var="c" binding="#{AddEntryMB.dataTable}" > 

<h:column> 
    <f:facet name="header">Select</f:facet> 
     <h:selectOneRadio valueChangeListener="#{AddEntryMB.setSelectedItem}" 
       immediate="true" onchange="dataTableSelectOneRadio(this);"> 
        <f:selectItem itemValue="null" /> 
      </h:selectOneRadio> 
</h:column> 

<h:column> 
    <f:facet name="header">Last Name</f:facet> 
    #{c.lastName} 
</h:column> 

</h:dataTable> 
</h:panelGrid> 

<h:panelGroup> 
    <h:commandButton action="#{AddEntryMB.add}" value="add" /> 
    <h:commandButton action="cancel" value="cancel" immediate="true"/> 
</h:panelGroup> 

這裏是支持bean。

@ManagedBean(name="AddEntryMB") 
@ViewScoped 
public class AddEntryMB implements Serializable { 
private int rowIndex; 
private int idValue; 
    private transient HtmlDataTable dataTable; 

public void setSelectedItem(ValueChangeEvent event) { 

    rowIndex = dataTable.getRowIndex(); 

} 

public void add() 
{ 
    DefaultScheduleEntry entry = new DefaultScheduleEntry(); 
    entry.setId(RandomStringUtils.randomNumeric(32)); 
    entry.setStartTime(from); 
    entry.setEndTime(until); 
    entry.setTitle(title); 
    entry.setSubtitle(location); 
    entry.setDescription(comments); 
} 
+0

啊哈哈!我將範圍更改爲Session,並突然生效!是否有列表解釋什麼可以用於ViewScope? – Dave

+0

另外,有誰明白爲什麼ViewScope會有這種效果? – Dave

回答

0

的視圖範圍的bean將在每RESTORE_VIEW階段時通過binding綁定組件的視圖的屬性重新創建作用域bean。這被稱爲JSF issue 1492併爲即將到來的JSF 2.2而修復。

在這種特殊情況下,您最好從EL環境中刪除binding="#{AddEntryMB.dataTable}"並獲取當前的var="c"

public void setSelectedItem(ValueChangeEvent event) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    DefaultScheduleEntry c = context.getApplication().evaluateExpressionGet(context, "#{c}", DefaultScheduleEntry.class); 
    // ... 
} 
相關問題