2016-08-04 34 views
2

我無法找到在獲取數據表的過濾值後更新組件的方法。我嘗試不同的方法:如何在數據表中找到新的過濾值黃頁

  • 測試1:我嘗試使用Filter事件的行動,但該事件值的變化之前完成,所以我不能讓我的計算新值

  • 測試2:我嘗試使用Filter事件的監聽器,但在AjaxBehaviorEvent

  • 測試3我無法找到新的價值觀:我嘗試調用我的函數的過濾的二傳手值,計算已完成但未更新...所以我嘗試使用RequestContext的primefaces,但它也不起作用。

告訴我,如果你有一個想法解鎖的一種方式,或提出新的解決方案=)

感謝您的幫助!

控制檯返回,顯示事件的順序。

>test 1 
>test 2 
>update other 
>update filtered values 
>test 3 

HTML代碼:

<h:form id="form1"> 
    <p:dataTable var="_remontee" value="#{ConsultationSaisieBean.m_valuesInDataGrid}" 
    filteredValue="#{ConsultationSaisieBean.m_filteredValues}" > 

     <p:ajax event="filter" listener="#{ConsultationSaisieBean.OnFilter}" 
     action="#{ConsultationSaisieBean.FilterAction}" update=":form2"/> 

     <p:columns value="#{ConsultationSaisieBean.m_columns}" var="column" 
     filterBy="#{_remontee[column.property]}" filterMatchMode="contains"> 
      <f:facet name="header"> 
       <h:outputText value="#{column.header}" /> 
      </f:facet> 
      <h:outputText value="#{_remontee[column.property]}" /> 
     </p:columns> 
    </p:dataTable> 
</h:form> 

<h:form id="form2"> 
    <p:outputLabel id="other" value="#{ConsultationSaisieBean.m_serviceResult}" /> 
</h:form> 

Java類:

/** 
* function of the filter event's action 
*/ 
public void FilterAction() 
{ 
    // TEST 1 
    System.out.println("test 1"); 
    setM_consummableResult(Resultof(m_filteredValues)) 
} 

/** 
* function of event's listener 
*/ 
public Map<String, Object> OnFilter(AjaxBehaviorEvent p_event) 
{ 
    // TEST 2 
    System.out.println("test 2"); 
    setM_consummableResult(Resultof(m_filteredValues)) 

    // return values wanted by the event 
    DataTable table = (DataTable) p_event.getSource(); 
    Map<String, Object> filters = table.getFilters(); 
    return filters; 
} 

/** 
* Setter of the filtered values 
*/ 
public void setM_filteredValues(List<Map<String, String>> p_filteredValues) 
{ 
    // UPDATE FILTERED VALUES 
    System.out.println("update filtered values"); 

    super.setM_filteredValues(p_filteredValues); 

    // TEST 3 
    System.out.println("test 3"); 
    setM_consummableResult(Resultof(m_filteredValues)) 

    //Test to force update 
    RequestContext context = RequestContext.getCurrentInstance(); 
    context.addCallbackParam("saved", true); 
    context.update("form2:other"); 
} 

/** 
* function to count the new result 
*/ 
public void Resultof(List<Map<String, String>> p_filteredValues) 
{ 
    /* calcul the new values */ 
} 

/** 
* getter for update the other component 
*/ 
public Double getM_consummableResult() 
{ 
    return m_consummableResult; 
    // UPDATE 
    System.out.println("update other"); 
} 

public List<Map<String, String>> getM_filteredValues() 
{ 
    return m_filteredValues; 
} 

private void setM_consummableResult(Double m_consummableResult) 
{ 
    this.m_consummableResult = m_consummableResult; 
} 
+0

使用LazyDataModel更容易 – Kukeltje

+0

LazyDataModel更改獲取/保存值而不是組件事件的方式,它如何幫助我在這裏進行過濾? –

回答

0

我有同樣的問題,因爲你。我一直在使用remotecommand解決...

<p:ajax event="filter" oncomplete="handleLoadStart();" update=":frm1:tablaFact :frm1:panelTotal"/> 

...

<p:remoteCommand id="rcom" name="loadRemoteContent" process="@this" update="panelTotal, tablaFact" actionListener="#{listadoFacturasMB.filterListener2}"/> 

...

<h:outputScript id="waypointScript" target="body"> 
    function handleLoadStart() {      
       loadRemoteContent();      
       } 

</h:outputScript> 

...

public void filterListener2() { 
    try { 
     if (filterFacturaUtilList != null) { 
      //then filter is active, do something... 
     } 

    } catch (Exception e) { 
     JsfUtil.addErrorMessage(e, "Error: filterListener() " + e.getMessage()); 
    } 
} 

filterFacturaUtilList是filteredValue

+0

完美,這正是我需要的!謝謝你的幫助! =) –

+0

很高興,您可以添加一個投票。 – meyquel

相關問題