【问题标题】:primefaces charts not updating when submit a new request提交新请求时primefaces图表不更新
【发布时间】:2012-10-17 07:20:44
【问题描述】:

我提交数据并显示图表但是当我再次通过在表单中​​插入新值提交它时,图表不会自行更新。我看到的另一件事是当我刷新页面时,它会更新图表和图表新值得到显示。
例如,如果我给出值
Wheat=40Sugar=60
并提交,它将显示图表。
现在当我提交
strong>Wheat=90 和 Sugar=10 ,它只显示旧图表仍然存在于页面上。
现在如果我刷新页面,具有更新值的图表将可用。
我怎样才能摆脱这个问题:(如果有人有,请提出解决方案。
这是我的代码
图表代码

<p:barChart id="horizontal"
                        value="#{reportingCharts.categoryModel}" legendPosition="se"
                        style="width:635px;height:500px" title="Horizontal Bar Chart"
                        orientation="horizontal" min="0" max="150" animate="true"
                        zoom="true" barMargin="90"
                        rendered="#{chartsRendering.barCharts}" showDatatip="true" shadow="true" />

按钮代码

<h:commandButton id="btnLanguage" action="#{reportingCharts.getGraphValuesOnLanguageBasis}"
                                value="Plot Chart Language">
                                </h:commandButton>

getGraphValuesOnLanbguageBasis 方法

public void getGraphValuesOnLanguageBasis() {

        categoryModel = null;


            resList = (ArrayList<ChartResult>) serviceObj
                .getChartByLanguage(ranks, language);

        if (chartType.equalsIgnoreCase("bar")
                || chartType.equalsIgnoreCase("line")
                || chartType.equalsIgnoreCase("column")) {

            categoryModel = new CartesianChartModel();

            ChartSeries langChart = null;


            for (int a = 0; a < ranks.length; a++) {

                langChart = new ChartSeries();
                if(a == 0){
                    for(int z=0;z<language.length;z++){

                        langChart.set(languageMap.get(Integer.parseInt(language[z])),0);

                    }
                    }

                String rank = "";
                boolean rankAvailable = false;
                for (int x = 0; x < resList.size(); x++) {

                    if(Integer.parseInt(resList.get(x).getRankId()) == Integer.parseInt(ranks[a])){
                        rank = resList.get(x).getRankName();

                        x = resList.size();
                        rankAvailable = true;

                    }
                }


                if(rankAvailable == false){

                    langChart.setLabel(rankMap.get(Integer.parseInt(ranks[a])));

                }
                else{

                    langChart.setLabel(rank);
                }


                for (int x = 0; x < resList.size(); x++) {


                    if (Integer.parseInt(resList.get(x).getRankId()) == Integer
                            .parseInt(ranks[a]) && rankAvailable == true) {

                                                langChart.set(languageMap.get(Integer.parseInt(resList.get(x).getCriteria())), Integer
                                .parseInt(resList.get(x).getNoOfPersons()));


                    }

                }

                categoryModel.addSeries(langChart);

            }

        } else if (chartType.equalsIgnoreCase("pie")) {



                pieModel = new PieChartModel();


                for (int x = 0; x < resList.size(); x++) {

                        pieModel.set(languageMap.get(Integer.parseInt(resList.get(x).getCriteria())), Integer
                                .parseInt(resList.get(x).getNoOfPersons()));

                }

        }
        ChartsRendering chartRenderer1 = (ChartsRendering) FacesContext
                .getCurrentInstance().getExternalContext().getSessionMap()
                .get("chartsRendering");


        if (chartType.equalsIgnoreCase("bar")) {
            chartRenderer1.showBarChart();

        } else if (chartType.equalsIgnoreCase("line"))
            chartRenderer1.showLineChart();
        else if (chartType.equalsIgnoreCase("column"))
            chartRenderer1.showColumnChart();
        else if (chartType.equalsIgnoreCase("pie"))
            chartRenderer1.showPieChart();

    }

【问题讨论】:

  • 您是否正在使用您使用的那个按钮的update="chartOrItsWrapperID" 更新图表或其包装?发布您的代码...
  • 是的。你想看哪一部分?
  • 您希望更新图表的按钮,以及您的图表

标签: jsf jsf-2 primefaces


【解决方案1】:

更改模型值后图表不会自行更新,但您可以通过 ajax update 它。例如,如果您有一个图表:

<p:barChart id="myBarChart" value=#{yourChartBean.chartModel} ..../>

和一个将新值发送到您的支持 bean 的 selecteOneMenu,定义一个方法来更新您的支持 bean 中的模型:

<p:selectOneMenu id="aMenu" value="#{yourChartBean.menuValue}">
    <p:ajax event="change" update="myBarChart" listener="#{yourChartBean.refreshChart()}"/>
    <f:selectItem itemLabel="This value" itemValue="tv"/>
    <f:selectItem itemLabel="Another value" itemValue="av"/>
</p:selectOneMenu>

在这种情况下,refreshChart() 方法旨在更新您的图表模型:

public void refreshChart() {
    buildChart();
} 

private void buildChart() {
    chartModel = new CartesianChartModel();

    ChartSeries series1 = new ChartSeries();
    ...

    ChartSeries series2 = new ChartSeries();
    ...

    categoryModel.addSeries(series1);
    categoryModel.addSeries(series2);
}

【讨论】:

  • 当然,如果您有一个按钮,请在您的按钮上设置更新目标,例如&lt;p:button .... ajax="true" update="myBarChart" actionListener="#{yourChartBean.refreshChart()}"/&gt;
  • ok akoskm :) thnx 让我 chk .. 还有一件事,如果
  • 如果您知道如何使用 &lt;h:commandButton/&gt; 实现 ajax 请求,它将为您工作。
  • 如果您不知道如何使用&lt;h:commandButton/&gt; 实现ajax,请参见Daniel 的代码。
  • 我试过了,但也没有用:(
【解决方案2】:

当页面加载时图表应该是可见的......之后所有 ajax 请求都会正确呈现您的图表。 为此,只需在页面加载时提供一个虚拟系列数据,例如系列 1 的 (0,0) 和系列 2 的 (0,0) ,之后一切正常

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 2018-12-04
    • 2012-11-20
    • 2017-08-30
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2013-06-26
    • 2019-01-04
    相关资源
    最近更新 更多