我在同一页面上有几个这样的表格:
<h:form>
<h:selectOneMenu value="#{collectionBean.selectedCollection}">
<f:selectItems value="#{collectionBean.collectionItems}" />
<a4j:support event="onchange" />
</h:selectOneMenu>
<a4j:commandButton value="Add" action="#{collectionBean.addToCollection(_resource)}" >
</a4j:commandButton>
</h:form>
这是我的Bean:
@Name("collectionBean")
@Scope(ScopeType.SESSION)
public class CollectionBean {
private String selectedCollection;
public String getSelectedCollection() {
return selectedCollection;
}
public void setSelectedCollection(String collectionName) {
selectedCollection = collectionName;
}
public List<SelectItem> getCollectionItems() {
...
}
public void addToCollection(Resource res) {
...
}
}
表单与资源_resource
相关联,其目标是让用户将资源添加到他选择的集合中。
问题是只有页面上的最后一个表单才有效:在更改其他表单中的选择时,永远不会调用setSelectedCollection
方法。
你知道可能出现什么问题吗?
答案 0 :(得分:0)
正如here所述,在注释中,将几个组件绑定到同一个bean属性是没有意义的。所以我在支持bean中使用了Map,资源id作为密钥。
<h:selectOneMenu value="#{collectionBean.selections[_resource.id]}">
<f:selectItems value="#{collectionBean.collectionItems}" />
<a4j:support event="onchange" />
</h:selectOneMenu>
尽管如此,它并没有解决主要问题:只有页面上的最后一个表格才有效。对于所有其他形式,方法getSelections
从未被调用。
然后,我没有使用多个表单(每个选择菜单有一个表单),而是使用了一个单独的表单。我不知道为什么,但它有效......