Как обнаружить обновление таблицы данных PrimeFaces - PullRequest
0 голосов
/ 07 декабря 2011

У меня довольно простой и понятный вопрос. Есть ли способ, как обнаружить изменения в dataTable?

Допустим, у меня есть таблица данных, использующая нумерацию страниц. И теперь, когда я перехожу со страницы 1 на страницу 2, мне нужно обнаружить это событие и обновить компонент gMap на той же странице (мне нужен gMap, чтобы обновить свою dataModel из резервного компонента). Я пытался использовать параметр обновления, но, как упоминается в документации PF, он устарел и не работал.

Я могу обновить gMap, вручную нажимая кнопку p:, но мне нужно сделать это автоматически после изменения таблицы данных.

Возможно, есть решение, использующее javascript и привязывающий датируемый виджет к какому-либо действию, но я действительно не знаю: (

Заранее спасибо за любую помощь


UPDATE

Мой метод инициализации LazyDataMethod:

private LazyDataModel<Poi> lazyModel;

private void initializeLazyModel() {
    lazyModel = new LazyDataModel<Poi>() {

        @Override
        public List<Poi> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {                
            List<Poi> data = service.getPoisLazily(first, pageSize, sortField, sortOrder, filters);
            pois = data;
            createMapForPOIs(pois);
            return data;
        }
    };

    lazyModel.setRowCount(getNumberOfRows());
}

Далее есть только метод получения / установки для LazyDataModel:

public LazyDataModel<Poi> getLazyModel() {
    return lazyModel;
}

public void setLazyModel(LazyDataModel<Poi> lazyModel) {
    this.lazyModel = lazyModel;
}

В pois.xhtml у меня есть объявление данных следующим образом:

<p:dataTable update="formMap:map" id="tablePois" var="poi" value="#{poiController.lazyModel}"  lazy="true"
                         paginator="true" rows="10" paginatorPosition="bottom"
                         selection="#{poiController.poi}" rowSelectListener="#{poiController.showPoi}" selectionMode="single"
                         paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                         rowsPerPageTemplate="5,10,15,30,50">                                                       

                <p:column>  
                    <h:outputText value="#{poi.name}" />
                </p:column>
</p:dataTable>

Итак, на данный момент я бы хотел использовать

RequestContext context = RequestContext.getCurrentInstance(); 
context.addPartialUpdateTarget("form:gMapId");

как предложено @spauny. Но не знаю, куда в бобе положить его.

1 Ответ

1 голос
/ 07 декабря 2011

Надеемся, что вы используете Primefaces 3.0.M4 ...

Возможны два решения: первое включает только Primefaces, а точнее, компонент RequestContext.Благодаря мощности Primefaces вы можете получить (на стороне сервера) экземпляр RequestContext и использовать метод с именем addPartialUpdateTarget.После того, как пользователь запрашивает другую страницу, метод, возвращающий список, вызывается снова;это лучшее время для вас, чтобы обновить gMap(server-side):

RequestContext context = RequestContext.getCurrentInstance(); 
context.addPartialUpdateTarget("form:gMapId");

. Вы можете найти информацию здесь: http://www.primefaces.org/showcase-labs/ui/requestContext.jsf и, конечно, вы можете прочитать Руководство пользователя Primefaces для 3.0.M4.

И есть еще одно решение, которое, конечно, намного хуже первого (в этом контексте), но может помочь вам в других ситуациях: dataTable pagination это лениво (это означает, что запрос ajax выполняется каждый раз).время пользователь запрашивает другую страницу результатов), поэтому вы можете перехватить запрос ajax с помощью компонента ajaxStatus (http://www.primefaces.org/showcase-labs/ui/ajaxStatusHome.jsf - см. как декларативный, так и программный) и onstart вы можете вызвать функцию javascript (чтоможет иметь возможности ajax) - конечно, downsides заключается в том, что вам придется реализовать эту функцию, но хуже всего то, что вы можете реализовать только один статус ajax на страницу (это означает, что каждый запрос ajax будет вызывать функцию javascript с возможностями ajax),

Так что вам лучше использовать RequestContext, но ajaxStatus - это очень приятный и важный компонент: вы можете показать загрузочный gif для каждого запроса ajax или вызвать функцию javascript, которая показывает пользователю некоторые приятные / интересные вещи (на странице).

...