我的valuechangelistener方法没有像我预期的那样被调用。我有一个h:selectOneRadio组件(如下所示),我希望在单击add按钮时调用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);
}发布于 2012-09-15 21:14:23
当您通过binding将组件绑定到视图作用域bean的属性时,视图作用域bean将在每个RESTORE_VIEW阶段重新创建。这就是所谓的JSF issue 1492,并在即将发布的JSF2.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);
// ...
}https://stackoverflow.com/questions/12433288
复制相似问题