Обновить dataTable (используя ленивую загрузку) из другого компонента - PullRequest
2 голосов
/ 23 ноября 2011

Я использую отложенную загрузку с разбиением на страницы в dataTable и работает нормально. Проблема в том, что у меня есть функция расширенного поиска на той же HTML-странице, и когда я нажимаю на кнопку поиска, я хочу, чтобы моя dataTable обновлялась в соответствии со значениями, которые я ввел в полях расширенного поиска (эта функция реализована в DaoFactory.getDocumentoDao().buscarLazy(first, pageSize), код ниже. Но атрибут update у моей кнопки, похоже, ничего не делает, потому что метод загрузки ленивой модели не вызывается. Итак, вопрос: могу ли я как-то вызвать метод загрузки ленивой модели снаружи модели для обновления моего dataTable?

FORM:

<h:form id="frmCli">
    <p:commandButton value="Buscar"
                     update="frmCli:panelResultadosDoc"/>
    <h:panelGroup id="panelResultadosDoc">
        <div class="dataTable">     
            <p:dataTable id="documentos"
                         value="#{documentoBuscadorBean.lazyModel}"
                         lazy="true"
                         var="varDocBean"
                         paginator="true"
                         paginatorPosition="bottom"
                         paginatorAlwaysVisible="false"
                         rows="5">           
                <p:column>
                   <f:facet name="header">Código</f:facet>
                   <h:outputText value="#{varDocBean.documento.id}"/>
                 </p:column>                                                         
            </p:dataTable>
        </div>     
    </h:panelGroup>
</h:form>

Боб, содержащий модель:

@ManagedBean
@SessionScoped
public class DocumentoBuscadorBean {

   private LazyDataModel<DocumentoBean> lazyModel;

   @SuppressWarnings("serial")
   public DocumentoBuscadorBean() {

      lazyModel = new LazyDataModel<DocumentoBean>() {

      public List<DocumentoBean> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String,String> filters) { 
            List<DocumentoBean> lazyListDocumentos = new ArrayList<DocumentoBean>();
               try {                  
                  lazyListDocumentos = DaoFactory.getDocumentoDao().buscarLazy(first, pageSize);
             } catch (DocumentoException e) {
                e.printStackTrace();
             }
               return lazyListDocumentos;
           }         
         };            
         lazyModel.setRowCount(DaoFactory.getDocumentoDao().rowCount());
         lazyModel.setPageSize(5);
   }
   public LazyDataModel<DocumentoBean> getLazyModel() {
      return lazyModel;
   }

}

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Если я что-то не пропустил, вы можете просто использовать действие:

<p:commandButton value="Buscar"
                 action="#{documentoBuscadorBean.lazyModel.load(0,10,...)}"
                 process="@form"
                 update="frmCli:panelResultadosDoc"/>

Было бы лучше добавить версию загрузки без параметров, чтобы не смешивать логику в своем представлении.Это даже обязательно, если вы по какой-то причине не можете использовать EL 2.2 (хотя я настоятельно рекомендую EL 2.2, тем не менее, это избавит вас от уродливой обработки f: param).

0 голосов
/ 23 ноября 2011

Что это значит #{varDocBean.documento.id}?varDocBean является DocumentoBean - поэтому documento является свойством DocumentoBean?

Кроме того, что commandButton ничего не делает?Я вижу только одну команду commandButton, но без метода действия.

Вы должны снова взглянуть на lazy dataTable в лабораторной витрине Primefaces: http://www.primefaces.org/showcase-labs/ui/datatableLazy.jsf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...