gpt4 book ai didi

jsf - 在 Setter 之前调用的事件函数

转载 作者:行者123 更新时间:2023-12-04 15:51:55 27 4
gpt4 key购买 nike

我有以下下拉列表,其中列出了几辆汽车,我有它以便它将所选项目的值存储在 backbean 变量中并触发一个事件,以便其他下拉列表将根据此下拉控件的所选值填充如下:

  <Td>
<h:selectOneMenu id="combocarList"
value="#{customerBean.selectedcar}"
styleClass="comboStyle"
valueChangeListener="#{customerBean.loadothercombos}"
onchange="document.forms[0].submit()"
>
<f:selectItem
itemLabel="-----------Select--------------"
itemValue="None" />
<f:selectItems value="#{customerBean.carsList}" />
</h:selectOneMenu>
</Td>

问题是当从上面的下拉列表中选择一个项目时,事件 loadothercombos 在 setter 之前调用会导致问题。

注意,backbean 客户定义为:

 <managed-bean-name>customerBean</managed-bean-name>
<managed-bean-class>com.theway.customer</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>

当我从下拉列表中选择一个项目时,我在调试中看到的行为:

1) Getter is called for selectedcar
2) Loadothercombos is called <------- This is called by the event
3) Setter is called for selectedcar

在调用 loadothercombos 之前,我无法让它调用 setter。任何见解将不胜感激。谢谢

最佳答案

使用 valueChangeListener为此目的一直是一种hacky方式。基本上,有两种方法可以解决这个“问题”:

  1. 调用 FacesContext#renderResponse() 这样 JSF 将立即进入渲染响应阶段,因此将跳过更新模型值(和调用操作)阶段:

    public void loadothercombos(ValueChangeEvent event) {
    selectedcar = (String) event.getNewValue();
    loadOtherCombosBasedOn(selectedcar);
    // ...

    FacesContext.getCurrentInstance().renderResponse();
    }
  2. 将事件排队以调用 Action 阶段,以便在调用 setter 后完成其工作:

    public void loadothercombos(ValueChangeEvent event) {
    if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) {
    loadOtherCombosBasedOn(selectedcar);
    } else {
    event.setPhaseId(PhaseId.INVOKE_APPLICATION);
    event.queue();
    }
    }

如果您使用的是 JSF 2.0,那么在 <f:ajax> 的帮助下有一个更简单的方法来处理这个问题。 :

<h:selectOneMenu id="combocarList" 
value="#{customerBean.selectedcar}"
styleClass="comboStyle">
<f:selectItem
itemLabel="-----------Select--------------"
itemValue="None" />
<f:selectItems value="#{customerBean.carsList}" />
<f:ajax listener="#{customerBean.loadOtherCombos}" render="otherComboIds" />
</h:selectOneMenu>

public void loadothercombos() {
loadOtherCombosBasedOn(selectedcar);
}

与具体问题无关:“组合框”是此下拉元素的错误术语。组合框是一个可编辑下拉菜单,它基本上是 <input type="text"> 的组合和 <select> .你所拥有的只是单独渲染<select>这些只是下拉菜单,所以也这样调用它们。

关于jsf - 在 Setter 之前调用的事件函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7722351/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com