Использование AJAX для обновления компонентов диаграммы PF7 с отфильтрованными значениями из datatable - функция извлекает отфильтрованные значения перед их обновлением - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь прикрепить событие AJAX к таблице данных в моем приложении PrimeFaces, чтобы некоторые компоненты диаграммы, которые дают различные сводные представления содержимого таблицы, обновлялись соответствующим образом при ее фильтрации.

У меня естьпопытался использовать компонент PrimeFaces AJAX для асинхронного перерисовывания диаграмм, вызванного фильтрацией таблицы.

Я добавил следующее в таблицу данных в моем xhtml:

<p:ajax event="filter" listener="#{myView.updateAfterFilter()}" />

и вmy java:

    public void updateAfterFilter() throws JSONException, IOException, ParseException, IllegalAccessException {        
        List<String> hashes = null;

        try{
//Call a function to return a list of strings corresponding to hashes of the entries in the filtered table
            hashes = filteredElementHashes();
//Resubmit the query, retrieving only the data for the entries in the filtered table, and redraw the charts
            chartsData = list.parseData(queryString, null, null, hashes);
            makeCharts();
        } catch (NullPointerException ex) {
            System.err.println("Null hashes!");
        }     
    }

//And for illustration, the hash function that reads in the data from this.filteredElements
    public List<String> filteredElementHashes() throws IllegalAccessException {
        List<String> hashes = new ArrayList<>();
        Field[] fields = DataElement.class.getFields();

        for (DataElement element : this.filteredElements) {
            String temp = new String();

            //Append content of each field
            for (Field field : fields) {
                temp += field.get(element).toString();
            }
            //Remove whitespace, order, and pass to hash function
            temp = MiscFunctions.hashString(temp);
            hashes.add(temp);
        }
        return hashes;
    }

Функция updateAfterFilter вызывается компонентом AJAX при фильтрации таблицы, но она получает версию this.filteredElements до того, как будет применен текущий фильтр;это заставляет диаграммы отображать информацию, которая не синхронизирована с таблицей.Однако, когда я связываю updateAfterFilter с компонентом кнопки и запускаю его вручную после того, как отфильтрую таблицу, поведение будет таким, как ожидалось.Я хотел бы, чтобы диаграммы перерисовывались после , когда таблица перерисовывалась, тогда как текущее поведение согласуется с процессом регенерации данных диаграммы, начинающимся до регенерации таблицы с новыми фильтрами на месте.

...