ValueChangeListener problem



在根据下拉列表中的值更改调用JSF中的ValueChangeListener时,它正在调用该页面上的所有ValueChangeListner。

DataTable中有两个valueChangeListener,而在一个dropd中更改值,第二个也执行。

<t:column id="avlId" styleClass="coltextcenteralign">
            <f:facet name="header">
                <h:panelGroup>
                    <h:outputText value="#{bundle['travelLocalAccommodation.title.availability']}" />
                    <h:outputText value="*" style="color:red" />
                </h:panelGroup>
            </f:facet>
            <t:selectOneMenu value="#{accomDtls.availability}" immediate="true"
                valueChangeListener="#{TravelProcessingBB.localAccommodationBB.setAvailableFlag}" forceid="true" id="avl"
                onchange="return availabilityAlert('#{accomDtls.prepopulatedFlag}','avl[#{table_count}]')"
                styleClass="dropDownStyle" style="width:50">
                <f:selectItem itemValue="Y" itemLabel="Yes" />
                <f:selectItem itemValue="N" itemLabel="No" />
            </t:selectOneMenu>
        </t:column>

值更改本身不会自动调用valueChangeListener。您还需要提交表格。一个常用的"hack"是在onchange事件期间使用 JavaScript 调用form.submit()。但是,这将提交整个表单。实际上,将为表单的所有已更改字段触发valueChangeListener

要在 JSF 1.x 中解决此问题,您需要使用 immediate 属性来跳过所有其他表单组件的验证和组件binding,以便您可以正确获取/设置其他组件的值。长话短说,我曾经写过一篇关于这个问题的文章:在 JSF 1.2 中填充子菜单。

然而,在 JSF 2.0 中,借助<f:ajax>标记更容易实现这一点。如果您确实在使用 JSF 2.0(您当前的问题没有表明这一点),那么如果您需要示例,请告诉我。

相关内容

  • 没有找到相关文章