我有一个遍历列表的数据表,我们称之为 myList。我根据一些请求参数填充了这个 myList。在数据表里面有commandLinks。如果我在应用请求值阶段将一个虚拟条目放入 myList,我可以单击第一个 commandLink,它会正常工作(它在调用应用程序阶段执行,然后正确的条目在 myList 中)。如果我不这样做,或者我单击第二个或以后的 commandLink,则不会发生任何事情。所以我猜测命令按钮的clientId是在应用请求阶段解决的,即使它只在调用应用程序阶段使用,这会导致commandLinks损坏。
像这样的东西:
<h:selectManyCheckbox styleClass="hidden"
value="#{cc.attrs.selectionList.selected}"
converter="#{cc.attrs.converter}" >
<f:selectItems value="#{cc.attrs.selectionList.all}"
var="item" itemValue="#{item}" itemLabel="" />
</h:selectManyCheckbox>
<h:dataTable value="#{cc.attrs.selectionList.selectedTest}" var="item">
<h:column>
<h:commandLink value="deselect" action="#{cc.attrs.selectionList.deSelect(item)}">
<f:ajax execute=":#{component.parent.parent.parent.clientId}"
render=":#{component.parent.parent.parent.clientId}" />
</h:commandLink>
</h:column>
</h:dataTable>
和模型:
public List<E> getSelected()
{
return myList;
}
public List<E> getSelectedTest()
{
if(FacesContext.getCurrentInstance().getCurrentPhaseId().equals(PhaseId.RESTORE_VIEW) && getSelectedList().isEmpty())
{
return Collections.singletonList(myList.get(0));
}
else if(FacesContext.getCurrentInstance().getCurrentPhaseId().equals(PhaseId.APPLY_REQUEST_VALUES) && getSelectedList().isEmpty())
{
return Collections.nCopies(2, myList.get(0));
}
else if(FacesContext.getCurrentInstance().getCurrentPhaseId().equals(PhaseId.PROCESS_VALIDATIONS) && getSelectedList().isEmpty())
{
return Collections.nCopies(3, myList.get(0));
}
else if(FacesContext.getCurrentInstance().getCurrentPhaseId().equals(PhaseId.UPDATE_MODEL_VALUES) && getSelectedList().isEmpty())
{
return Collections.nCopies(4, myList.get(0));
}
return myList;
}
public void deSelect(E item)
{
myList.remove(item);
}
在此示例中,数据表的前两个 commandLink 有效。我的问题是为什么会出现这种行为,有没有办法不用虚拟条目填充 myList ?我不想使用任何(viewscoped)支持 bean 来存储数据。