2013-08-06 2 views
2

Я использую p:dataTable от Primefaces 3.5 с ленивой загрузкой и динамическими столбцами.JSF lazy datatable с различными типами столбцов

У меня есть три типа столбцов, разница во входных данных для фильтрации. У одного есть p:inputText, у одного есть p:selectCheckboxMenu, а у последнего ничего нет.

Столбцы показаны по знаку c:foreach.

<c:forEach var="col" items="#{cc.attrs.bean.sortedModelColumns}"> 

Все работает нормально, но не «лениво». У меня также есть p:tabView, где каждая вкладка включает этот dataTable, и с каждым запросом все бобы инициализируются. Я знаю, что c:forEach оценивается во время сборки, так что это до tabView.

Поэтому, мой вопрос: как визуализировать разные столбцы внутри p:dataTable?

Я попытался ui:repeat следующим образом:

<p:dataTable 'datatableDefinition' /> 
    <ui:repeat var="#col" value="#{cc.attrs.bean.sortedModelColumns}"> 
     columnsRendering 
    </ui:repeat> 
</p:dataTable> 

но будет пустой DataTable. Когда я положил ui:repeat за пределы p:dataTable, он работает.

Я также попытался p:columns это делает все очень хорошо, но слушатели для фильтрации по p:inputText

<p:ajax event="keyup" listener="#{cc.attrs.bean.filterListener}" /> 

не работают.

Думаю, у меня есть два варианта. Во-первых: make p: столбцы работают как-то или пытаются использовать c:if в p:tabView, но я не знаю, как инициировать оценку теста внутри c:if при событии переключения табуляции.

В любом случае, я буду рад за любую помощь.

EDIT: Полный код DataTable

<p:dataTable widgetVar="entityTable" var="entity" value="# {cc.attrs.bean.loadEntities(cc.attrs.groupId)}" 
        resizableColumns="true" lazy="true" 
        rowStyleClass="#{entity.updated ? 'updatedRow' : ''}"      
        paginator="true" rows="10" 
        paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
        rowsPerPageTemplate="5,10,20" paginatorPosition="bottom" 
        scrollable="true" scrollWidth="#{userSessionBean.windowWidth -35}"> 
      <p:ajax event="colReorder" listener="#{cc.attrs.bean.onReorder}" /> 
      <p:ajax event="sort" listener="#{cc.attrs.bean.sortListener}" /> 
      <p:column style="width:20px" >      
       <f:facet name="header"> 
       <p:selectBooleanCheckbox value="#{cc.attrs.bean.checkbox}"> 
        <p:ajax onstart="return selectAll('#{component.clientId}');"/> 
       </p:selectBooleanCheckbox> 
       </f:facet>--> 
       <p:selectBooleanCheckbox value="#{cc.attrs.bean.checkbox}" styleClass="entitySelectCheckbox"> 
        <p:ajax listener="#{cc.attrs.bean.onEntitySelected(entity.id)}"/> 
       </p:selectBooleanCheckbox> 
       <p:commandLink id="notifIcon" styleClass=" #{entity.notification?'notification':''}" /> 
      </p:column> 
      <p:column style="width:13px" rendered="#{not empty cc.attrs.subview}"> 
       <p:commandLink process="@this" value="&nbsp;&nbsp;&nbsp;" id="loadEntity" styleClass="loadEntity" 
           immediate="true" onstart="hideRows('#{component.clientId}');" actionListener="#{cc.attrs.bean.setSelectedRowId(component.clientId)}" action="#{cc.attrs.bean.selectEntity(entity.id)}" 
           update="@(##{pe:escapeSelector(cc.clientId)}\\\\:entityTableForm)"/> 
      </p:column> 
      <p:columns var="col" value="#{cc.attrs.bean.sortedModelColumns}"> 
       <f:attribute name="property" value="#{col.property}" /> 
       <f:facet name="header"> 
        <div style="width: #{col.width}"> 
         #{col.header} 
        </div> 
        <p:outputPanel rendered="#{not cc.attrs.bean.isColDate(col.property)}" > 
         <p:inputText id="#{col.property}Id" styleClass="filterInput" rendered="#{not cc.attrs.bean.isColEnum(col.property) and not cc.attrs.bean.isColVisual(col.property)}" size="10" onkeyup="delay(function(){entityTable.filter();console.log('x');}, 500);" > 
          <p:ajax event="keyup" listener="#{cc.attrs.bean.filterListener}" /> 
          <f:attribute name="property" value="#{col.property}" /> 
          <f:attribute name="operator" value="#{col.operator}" /> 
          <f:event id="filterEvent" type="javax.faces.event.PreRenderComponentEvent" listener="#{cc.attrs.bean.filterRendered}"/> 
         </p:inputText> 

         <p:selectCheckboxMenu rendered="#{cc.attrs.bean.isColEnum(col.property)}" label="Choose" styleClass="filterInput"> 
          <f:attribute name="property" value="#{col.property}" /> 
          <f:selectItems value="#{cc.attrs.bean.getEnumStrings(col.property)}" var="item" /> 
          <p:ajax event="change" listener="#{cc.attrs.bean.onEnumFilterChange}" oncomplete="setTimeout('entityTable.filter()',200);"/> 
         </p:selectCheckboxMenu> 
        </p:outputPanel> 
        <p:outputPanel rendered="#{cc.attrs.bean.isColDate(col.property)}" > 
         <p:calendar pattern="#{userSessionBean.person.settings.timeFormat}" styleClass="filterInput filterInputDate"> 
          <f:attribute name="property" value="#{col.property}" /> 
          <f:attribute name="operator" value=">=" /> 
          <p:ajax event="dateSelect" listener="#{cc.attrs.bean.onDateFilterChange}" oncomplete="setTimeout('entityTable.filter()',200);" /> 
         </p:calendar> 
         <p:calendar pattern="#{userSessionBean.person.settings.timeFormat}" styleClass="filterInput filterInputDate"> 
          <f:attribute name="property" value="#{col.property}" /> 
          <f:attribute name="operator" value="&lt;=" /> 
          <p:ajax event="dateSelect" listener="#{cc.attrs.bean.onDateFilterChange}" oncomplete="setTimeout('entityTable.filter()',200);" /> 
         </p:calendar> 
        </p:outputPanel> 
       </f:facet> 
       <p:outputPanel rendered="#{not cc.attrs.bean.isColDate(col.property)}"> 
        <p:outputPanel rendered="#{not cc.attrs.bean.isColVisual(col.property)}"> 
         <h:outputText rendered="#{empty col.chainedProperty}" 
              value="#{entity[col.property]}" /> 
         <h:outputText rendered="#{not empty col.chainedProperty}" 
              value="#{entity[col.primaryProperty][col.chainedProperty]}" /> 
         <h:outputText rendered="#{not empty col.middleProperty}" 
              value="#{entity[col.primaryProperty][col.middleProperty][col.chainedProperty]}" /> 
        </p:outputPanel> 
       </p:outputPanel> 
       <kwe:inlineprogress status="#{entity.status}" rendered="#{cc.attrs.bean.isColVisual(col.property)}" /> 
       <h:outputText rendered="#{cc.attrs.bean.isColDate(col.property)}" value="#{cc.attrs.bean.dateTimeDisplay(entity[col.property])}"/> 
     </p:columns> 
     <f:event id="event2" type="javax.faces.event.PreRenderComponentEvent" listener="#{cc.attrs.bean.allRendered}"/> 
    </p:dataTable> 

ответ

2

вы не можете использовать Ui: повторить или гр: Foreach в р: DataTable, но я думаю, что вы можете использовать p:columns

+0

Спасибо за ответ. Я пытался использовать 'p: columns', но есть проблема с входами, у них одинаковые идентификаторы (все они). Поэтому прослушиватели ajax для фильтрации не работают. – tvazac

+0

Что вы используете * rowEdit * или * cellEdit * –

+0

Я редактировал оригинальный вопрос (добавленный код данных). Я не использую ни rowEdit, ни cellEdit. Код с 'c: forEach' вместо' p: columns' работает просто отлично (но не ленив) – tvazac