【问题标题】:Select Item from many menu从许多菜单中选择项目
【发布时间】:2012-11-13 19:51:10
【问题描述】:

好的,我有一个简单的许多菜单,我称之为监听器

<p:selectManyMenu style="width: 100%;" id="cmbsectores" valueChangeListener="#{mbcompletado.removeItem}">                                            
      <f:selectItems value="#{mbcompletado.sectores}"/>    
      <f:ajax update="@this"/>
</p:selectManyMenu>

我正在寻找可以使用 ValueChangeEvent 传递作为参数来检测选择了哪个项目的方法? 这样我就可以使用我的业务逻辑了!

我需要使用 ajax 标签吗?我在我正在使用的框架 primeface 中发现了一个 itemSelect 事件,但它仅适用于图表组件!

提前致谢

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    由于您已经在使用 PrimeFaces,请使用 p:ajax 而不是 f:ajaxevent 已设置为适当的事件 (valueChanged)。

    要检测selectManyMenu 的选定值,value 属性是必需的:

    <p:selectManyMenu style="width: 100%;" id="cmbsectores"
        value="#{mbcompletado.selectedSectores}">                                            
        <f:selectItems value="#{mbcompletado.sectores}"/>    
        <p:ajax/>
    </p:selectManyMenu>
    

    您可以完全移除 valueChangeListener 监听器。

    有关更完整的示例,请参阅SelectManyMenu

    编辑:

    在您的支持 bean 中,mbcompletado.selectedSectores 应该指向与您的 mbcompletado.sectores 相同类型的集合。例如,如果您的sectoresTypeAList,则selectedSectores 也应该是同一类型的List (TypeA)。

    类似的 backing-bean 结构可以在以下示例中找到 SelectManyCheckbox

    【讨论】:

    • 所以这个例子省略了 bean.java 因为它太简单了或者不需要它!?
    • @DavidAgustinAlmanzaGaitan 正确,该示例中的支持有两个相同类型的集合和适当的 getter/setter。我编辑了我的答案。
    • 但是,如果我希望收到某种 selectedItem 索引,那么该 ajax 方法事件会如何?
    • @DavidAgustinAlmanzaGaitan 在这种情况下,value="#{mbcompletado.selectedSectores}" 应该指向所选索引的列表。
    • @DavidAgustinAlmanzaGaitan 您是否成功检测到所选项目,或者您仍然面临同样的问题?
    【解决方案2】:

    您需要使用&lt;f:ajax listener&gt;(或者在这种情况下更好的&lt;p:ajax listener&gt;)方法。 ValueChangeListener 的用途完全不同,只有在您对旧值和新值都真正感兴趣时才应该使用,而不是在您只对新值感兴趣时使用。

    例如

    <p:selectManyMenu value="#{bean.selectedSectors>
        <f:selectItems value="#{bean.availableSectors}"/>    
        <p:ajax listener="#{bean.selectedSectorsChanged}" />
    </p:selectManyMenu>
    

    private List<String> selectedSectors;
    private List<String> availableSectors;
    
    public void selectedSectorsChanged() {
        System.out.println("Selected sectors are: " + selectedSectors); // Look, JSF has already set it.
        // ...
    }
    

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2022-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多