几个选择的菜单,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方法不会被调用。

你有什么可能是错误的想法?

+1

你是说你在单个视图已经多个组件,每个绑定到一个相同的bean的属性?这有什么意义?你不愿意将它们绑定到一个单独的bean属性,以便你可以获取单个值吗? – BalusC 2013-03-13 11:20:01

+0

它是一个资源表,对于这些资源中的每一个,用户都可以选择一个集合来添加资源。我没有在这里显示代码,但表单中还有一个“添加”按钮。 – eskaev 2013-03-13 11:58:15

+1

它看起来越来越像你的问题有哪些在这里回答了同样的原因:http://*.com/questions/10972284/hselectonemenu-in-loop/10973440#10973440你多个组件绑定到一个bean财产,并以某种方式期待这个单一的财产可以一次神奇地持有多个值。 – BalusC 2013-03-13 12:00:26

至于说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形式。我不知道为什么,但它的工作...

+0

*只有页面上的最后一个表单工作*这是正常的HTML行为,每个请求只能提交一个表单。 *然后,不是使用多个表单(每个选择菜单一个表单),而是使用基于最后一个语句的单个表单*,这是针对您的问题的可能解决方案。 – 2013-03-13 14:32:36

+1

顺便说一句,在这种情况下,您不应该将bean会话作用域,而是查看作用域。在CDI中,这可以使用[MyFaces CODI](http://myfaces.apache.org/extensions/cdi/)来实现。 – 2013-03-13 14:37:21

+0

也许,但没有什么能阻止我们在同一页上有多种表单并独立提交。 对于你是对的范围,但我也使用这个bean来处理需要会话范围的其他事情。另外,在刷新页面时保持先前的选择并不令人不快。 – eskaev 2013-03-13 15:18:32