【问题标题】:How to properly use selectOneMenu onchange event when missing ajax support? [duplicate]缺少 ajax 支持时如何正确使用 selectOneMenu onchange 事件? [复制]
【发布时间】:2015-11-02 16:24:25
【问题描述】:

我需要帮助解决我项目中的这个常见问题。

我想使用我的类 bean 中的方法根据另一个列表 list1 中当前选择的值刷新值列表 list2,我还想使用 Ajax 而不是加载整个页面。 rerender 属性在 selectOneMenu 中不可用。

我试过了:

        <h:selectOneMenu id="list1" value="#{bean.currentSelectedObject1}" onchange="submit()" 
        valueChangeListener="#{bean.methodAct}">

        <f:selectItems value="#{bean.listObjects1}" />
        </h:selectOneMenu>

应该更新的菜单:

        <h:selectOneMenu id="list2" value="#{bean.currentSelectedObject2}">

        <f:selectItems value="#{bean.listObjects2}" />
        </h:selectOneMenu>

我想知道是否可以使用一些 Richfaces 标签来做到这一点,或者是否有其他方法。

更新:

建议的解决方案给了我一个错误:<a4j:ajax> Tag Library supports namespace: http://richfaces.org/a4j, but no tag was defined for name: ajax 我可以看到a4j:ajaxListener 只有type 属性但没有a4j:ajax,也没有任何类型的f:ajax,我看过here,但我使用的是JSF 2.2 而不是JSF 2.0

谢谢

【问题讨论】:

  • 那么,您使用的是已弃用的 JSP 视图技术,而不是其后续的 Facelets?这完全解释了为什么 &lt;f:ajax&gt; 不适合你。它仅在 Facelets 中可用,在 JSP 中不可用。放弃 JSP 并迁移到 Facelets。寻求解决方法是徒劳的。
  • 非常感谢@BalusC,只需将文件重命名为 *.xhtml 我就能找到&lt;f:ajax&gt;!。

标签: ajax richfaces jsf-2.2


【解决方案1】:

以下代码在第一个列表中的更改事件上刷新第二个列表(在示例中选择多个列表,但选择一个列表的机制相同。另外,如果在第一个列表中选择了多个项目,则第二个为空):

<h:panelGrid columns="1" border="0" cellpadding="0" cellspacing="0">
    <h:outputLabel value="#{msg.clients}" for="clientList" styleClass="boldlabel">
        <span class="required">*</span>
    </h:outputLabel>
    <h:selectManyListbox id="clientList"
        value="#{reportForm.selectedProviderIds}"
        label="#{msg.client}" size="8"
        style="min-width:120px;"
        valueChangeListener="#{reportForm.providerSelectionChanged}"
        immediate="true"
        required="true">
        <f:selectItems value="#{reportForm.providerList.list.list}"
            var="client"
            itemLabel="[#{client.providerCode}] #{client.name}"
            itemValue="#{client.providerId}" />
        <a4j:ajax event="change" render="retailerList, programList" />
    </h:selectManyListbox>
</h:panelGrid>

<h:panelGrid columns="1" border="0" cellpadding="0" cellspacing="0">
    <h:outputLabel value="#{msg.retailers}"
        for="retailerList" styleClass="boldlabel" />
    <h:selectManyListbox id="retailerList"
        value="#{reportForm.selectedRetailerIds}"
        label="#{msg.retailer}" size="8"
        style="min-width:120px;"
        valueChangeListener="#{reportForm.retailerSelectionChanged}"
        immediate="true">
        <f:selectItems value="#{reportForm.retailers.list.list}"
            var="item"
            itemLabel="[#{item.retailerCode}] #{item.name}"
            itemValue="#{item.retailerId}" />
        <a4j:ajax event="change" render="programList" />
    </h:selectManyListbox>
</h:panelGrid>

还有 Java:

/**
 * Reaction on selection in client list box
 * @param event - Value change event with new value of selected clients
 */
public void providerSelectionChanged(ValueChangeEvent event) {
    setSelectedProviderIds((Long[])event.getNewValue()); // sets new value(s) and clean related
    cleanClientRelatedComponents();
}

/**
 * Clean up source for client related UI components
 */
private void cleanClientRelatedComponents() {
    retailers = null; // needed for rebuild retailers
    setSelectedRetailerIds(null); // clean up retailer related source of data inside
}

/**
 * Sets selected retailer IDs and clean up source for related components
 * @param selectedRetailerIds the selectedRetailerIds to set
 */
public void setSelectedRetailerIds(Long[] selectedRetailerIds) {
    this.selectedRetailerIds = selectedRetailerIds;
    if (selectedRetailerIds != null && selectedRetailerIds.length == 1) {
        setSelectedRetailerId(selectedRetailerIds[0]);
    } else {
        setSelectedRetailerId(0); // rebuild list
    }
}

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2014-11-02
    • 1970-01-01
    • 2012-07-18
    • 2021-12-31
    • 2010-11-25
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多