Jsf 如何在Ajax更新后调用方法

Jsf 如何在Ajax更新后调用方法,jsf,primefaces,Jsf,Primefaces,我有两个选择菜单:第一个选择用户想要的对象区域、等级、年龄,第二个过滤它 例如: 该地区有西部、北部、南部和东部 等级有A、B、C和D 因此,当用户选择GROUPBY选项时,侦听器调用onChangeGroupBy,加载所选选项的整个列表。因此,如果用户选择了Region,则onChangeGroupBy会设置selectedFilterBy=[西、北、南、东] 此外,我还更新了一个过滤器,名为flyoutId:cardsPanelId。第二个过滤器使用用户在此处的2个SelectOne菜单上选

我有两个选择菜单:第一个选择用户想要的对象区域、等级、年龄,第二个过滤它

例如:

该地区有西部、北部、南部和东部

等级有A、B、C和D

因此,当用户选择GROUPBY选项时,侦听器调用onChangeGroupBy,加载所选选项的整个列表。因此,如果用户选择了Region,则onChangeGroupBy会设置selectedFilterBy=[西、北、南、东]

此外,我还更新了一个过滤器,名为flyoutId:cardsPanelId。第二个过滤器使用用户在此处的2个SelectOne菜单上选择的相同输入。onchangefilter方法通过过滤列表来绘制图表,并为第二个过滤器设置输入

问题是:我想选择group by=grades和filter=D。在我更改A、B、C和D之间的选项时,第二个过滤器和图表会正确更新。之后,如果选择group by=region,则我的过滤器将更新为西、北、南和东,但不会调用onChangeFilterBy,因此过滤器和图表不会更新,但我需要更新它

我该怎么做?我试图强制onChangeGroupBy在方法末尾调用onChangeFilterBy,但这会导致问题,因为有时filterBy包含旧值。例如:filterBy=[A、B、C、D],但selectedGroupBy是Region

xhtml

豆子


我相信您需要做的是为p:ajax标记添加一个事件属性

特别是:

<p:ajax event="change" update="@(.dashboards) filterPanel flyoutId:cardsPanelId"  process="@this" listener="#{topicBean.dashboardHandler.onChangeGroupBy()}" oncomplete="dashboardCharts.loadDashboards()"/>

这将确保在更改选择时调用侦听器。

为什么?存在默认事件。在p:selectOneMenu的情况下,它是valueChange。您不显示您的bean是Requestcoped还是其他作用域?另外process=@这将只处理SelectOne,因此如果您使用的是RequestScoped bean,则不会提交另一个SelectOne的另一个值,因此将始终为NULL。
public void onChangeGroupBy() {
        switch (selectedGroupBy) {
            case REGION:
                this.setFilterBy(regionSelectItems);
                onChangeFilterBy();
                break;
            case GRADEs:
                this.setFilterBy(gradesSelectItems);
                onChangeFilterBy();
                break;
        }
    }

public void onChangeFilterBy() {
   String selectedGroupBy = this.selectedGroupBy;
   List<Card> cards = new ArrayList<>();
   this.model.resetFilters();

   switch (selectedGroupBy) {
      case REGION:
            this.model.setSelectedRegion(Collections.singletonList(selectedFilterBy));
            for (Card card : allCards) {
               //filter in the list and add in cards
               }
        
         generateChart(chartOne, cards);
         generateChart(chartTwo, cards);
         generateChart(chartThree, cards);
         break;
      case GRADES:
        
            this.model.setSelectedGrades(Collections.singletonList(selectedFilterBy));
            for (Card card : allCards) {
               //filter in the list and add in cards
            }
         }
         generateChart(chartOne, cards);
         generateChart(chartTwo, cards);
         generateChart(chartThree, cards);
         break;
   }
   this.model.secondFilter();
}
<p:ajax event="change" update="@(.dashboards) filterPanel flyoutId:cardsPanelId"  process="@this" listener="#{topicBean.dashboardHandler.onChangeGroupBy()}" oncomplete="dashboardCharts.loadDashboards()"/>