几个选择的菜单,A4J支持,只有最后一个工作
我有几种形式像这样在同一页上:几个选择的菜单,A4J支持,只有最后一个工作
<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>
这里是我的豆:
@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
方法不会被调用。
你有什么可能是错误的想法?
至于说here和评论,这是没有意义的几个组件绑定到一个bean属性。所以我在后台bean中使用了一个Map,资源ID是一个关键字。
<h:selectOneMenu value="#{collectionBean.selections[_resource.id]}">
<f:selectItems value="#{collectionBean.collectionItems}" />
<a4j:support event="onchange" />
</h:selectOneMenu>
不过,它没有解决主要问题:只有页面上的最后一个表单工作。对于所有其他形式,方法getSelections
从未被调用过。
然后,而是采用若干形式(一种形式为每个选择菜单),我使用单个englobing形式。我不知道为什么,但它的工作...
*只有页面上的最后一个表单工作*这是正常的HTML行为,每个请求只能提交一个表单。 *然后,不是使用多个表单(每个选择菜单一个表单),而是使用基于最后一个语句的单个表单*,这是针对您的问题的可能解决方案。 – 2013-03-13 14:32:36
顺便说一句,在这种情况下,您不应该将bean会话作用域,而是查看作用域。在CDI中,这可以使用[MyFaces CODI](http://myfaces.apache.org/extensions/cdi/)来实现。 – 2013-03-13 14:37:21
也许,但没有什么能阻止我们在同一页上有多种表单并独立提交。 对于你是对的范围,但我也使用这个bean来处理需要会话范围的其他事情。另外,在刷新页面时保持先前的选择并不令人不快。 – eskaev 2013-03-13 15:18:32
你是说你在单个视图已经多个组件,每个绑定到一个相同的bean的属性?这有什么意义?你不愿意将它们绑定到一个单独的bean属性,以便你可以获取单个值吗? – BalusC 2013-03-13 11:20:01
它是一个资源表,对于这些资源中的每一个,用户都可以选择一个集合来添加资源。我没有在这里显示代码,但表单中还有一个“添加”按钮。 – eskaev 2013-03-13 11:58:15
它看起来越来越像你的问题有哪些在这里回答了同样的原因:http://*.com/questions/10972284/hselectonemenu-in-loop/10973440#10973440你多个组件绑定到一个bean财产,并以某种方式期待这个单一的财产可以一次神奇地持有多个值。 – BalusC 2013-03-13 12:00:26