WedX - журнал о программировании и компьютерных науках

Primefaces5.1-commandLink действие и onclick не синхронизируются

Я обновил свое приложение с Primefaces 3.4.2 до Primefaces 5.1 и JSF 2.1.10 до версии 2.1.29. Моя логика ниже используется для работы со старыми банками, но после обновления оно показывает неожиданное поведение.

У меня есть commandLink, который загружает диалоговое окно onclick () event.Dialog box содержит динамическую таблицу данных, которая будет заполнена preLoadMethod в bean.

Перед обновлением до новых jar-файлов по щелчку commandLink диалоговое окно отображает результаты поиска в динамической таблице правильно, без проблем. После обновления до новых jar-файлов в диалоговом окне отображается «Записи не найдены». сообщение вместо результатов поиска при нажатии на commandLink. Я проверил, что данные доступны на стороне клиента, введя какое-то значение в поле фильтра, которое показывает отфильтрованные данные, и после удаления отфильтрованного значения я могу увидеть полные результаты поиска. диалоговое окно, а затем еще раз щелкните ссылку на команду. Я вижу результаты поиска в таблице данных, а затем через несколько секунд содержимое будет обновлено, и появится сообщение «Записи не найдены».

    1)xhtml code....

<html>
....
....
<h:body>
....
<h:form>
...
<h:panelGroup id="panelGroupId">
   <p:commandLink id="searchId" onclick="dialogVar.show()" process="@this" global="false" 
   action="#{bean.preLoadMethod}" update="@none">
   <f:setPropertyActionListener target="#{bean.selectedSearchId}" value="7" />
   <f:setPropertyActionListener target="#{bean.componentId}" value="ipComponent:searchForm_7:resultsTable" />
   <h:graphicImage styleClass="rollover imgAligntop" style="border:0;" name="search_on.png" library="images" />
   </p:commandLink>
   <p:tooltip for="panelGroupId" value="Search"></p:tooltip>
</h:panelGroup>
...
</h:form>
.....
<p:dialog id="dialogId" hideEffect="fade" modal="true" widgetVar="dialogVar" resizable="false"  appendTo="@(body)" 
   position="230,120" draggable="true" minimizable="false" maximizable="false" header="Dialog"> 
   <custom:searchComponent id="ipComponent" dialogName="searchDialog" searchId="7">
   </custom:searchComponent>
   <p:ajax event="close" listener="#{bean.closeDialog}" global="false"/>
 </p:dialog>
...
</h:body>
</html> 

2)Bean code

public void preLoadMethod() {
   //Gets the data from database and populates the List(searchDataList,filteredResults,columns) 
   which will be used by datatable to populate

   FacesContext facesContext = FacesContext.getCurrentInstance();
   DataTable dynamicDataTable = (DataTable) facesContext.getViewRoot().findComponent(componentId+"_"+selectedSearchId);
   if(dynamicDataTable != null) {
      lovDataTable.setEmptyMessage("No records found.");
   }

   RequestContext context = RequestContext.getCurrentInstance();
   String arr[] = {componentId+"_"+selectedSearchId};
   Collection<String> updateFields = Arrays.asList(arr);
   whereClause = "";
   context.update(updateFields);         
}

3)searchComponent.xhtml

<html>
....
...
<composite:interface.....
<composite:attribute name="searchId" required="true" />

</composite:interface>
<composite:implementation>

<h:form id="searchForm_#{cc.attrs.searchId}" onsubmit="return false;">  

----

<p:dataTable id="resultsTable_#{cc.attrs.searchId}" var="search" paginator="true" rows="10" value="#{bean.searchDataList}"
   selectionMode="single" pageLinks="5" paginatorPosition="both" rowIndexVar="rowIndexVar"
   paginatorTemplate="Page {CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
   paginatorAlwaysVisible="true"       
   filteredValue="#{bean.filteredResults}"
   widgetVar="searchTable_#{cc.attrs.searchId}"
   emptyMessage="Data is loading please wait...">

   <p:columns id="searchColumns" value="#{bean.columns}" var="column" sortBy="#{search[column.property]}"
   filterBy="#{search[column.property]}"
   rendered="#{fn:length(bean.searchDataList) gt 0}"
   filterMatchMode="startsWith"
   >
   <f:facet name="header">
   #{column.header}
   </f:facet>

   <h:outputText value="#{search[column.property]}" id="searchText" >

   </h:outputText>
   </p:columns>
</p:dataTable>
----
</h:form>   
---
</composite:implementation>
</html>
17.12.2014

Ответы:


1

Проблема заключается в ссылке на filterValue в резервном компоненте. Я устанавливал значения для этой ссылки в bean-компоненте, но не знаю, почему это работало нормально до версии PF 5.1.

Бин-код

private List filteredResults = new ArrayList();
---
public void preLoadMethod() {
  //Gets the data from database and populates the List(searchDataList,filteredResults,columns) 
   which will be used by datatable to populate
   searchDataList = //Populate from database;
   filteredResults=searchDataList;

   FacesContext facesContext = FacesContext.getCurrentInstance();
   DataTable dynamicDataTable = (DataTable) facesContext.getViewRoot().findComponent(componentId+"_"+selectedSearchId);
   if(dynamicDataTable != null) {
      lovDataTable.setEmptyMessage("No records found.");
   }

   RequestContext context = RequestContext.getCurrentInstance();
   String arr[] = {componentId+"_"+selectedSearchId};
   Collection<String> updateFields = Arrays.asList(arr);
   whereClause = "";
   context.update(updateFields);   

}

Теперь я просто предоставил ссылку filterValue с нулевым значением в bean-компоненте и методе получения / установки. Теперь он работает нормально.

Бин-код

private List filteredResults = null;

   public List getFilteredResults() {
      return filteredResults;
   }

   public void setFilteredResults(List filteredResults) {
      this.filteredResults = filteredResults;
   }
13.01.2015

2

Внутри вашего commandLink searchId используйте oncomplete вместо onclick и попробуйте еще раз.

Вы также можете изменить с action на actionListener.

Чтобы узнать больше, прочитайте этот пост.

17.12.2014
  • Я изменил onclick на oncomplete, но это не решило проблему. Также я использовал actionlistener с oncomplete, но это не решило проблему. Я также заметил, что когда я нажимаю commandLink, а затем через секунду снова нажимаю ссылку на команду, я получаю результаты поиска в datatable в диалоговом окне, что означает отправку запроса дважды в bean (preLoadMethod). 18.12.2014
  • Это было решено путем удаления атрибута datatable filterValue, но я не знаю, почему этот атрибут вызывает проблему в PF5.1. 12.01.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]