0

我的 valuechangelistener 方法没有像我预期的那样被调用。我有 ah:selectOneRadio 组件(如下),我希望在单击添加按钮时调用 valueChangeListener,但只有 add 方法被调用,setSelectedItem 方法被完全忽略。我错过了什么?请注意,javascript dataTableSelectOneRadio 执行良好。

这是.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);
}
4

1 回答 1

0

当您将组件绑定binding到视图范围 bean 的属性时,将在每个 RESTORE_VIEW 阶段重新创建视图范围 bean。这被称为JSF 问题 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);
    // ...
}
于 2012-09-15T13:14:22.987 回答