2016-08-04 4 views
2

データテーブルのフィルタリングされた値を取得した後で、コンポーネントの更新を行う方法が見つかりませんでした。私はFilterイベントのアクションを使用しようとするが、このイベントは、値の変更前に行われているので、私は新しい値データテーブルのプリミティブで新しいフィルタリングされた値を取得する方法

と私の計算をすることはできません。

  • テスト1:私は、さまざまな方法を試してみてください私は、フィルタリングのセッターで私の関数を呼び出すしよう:

  • テスト2:私は、Filterイベントのリスナを使用しようと、私はAjaxBehaviorEvent

  • テスト3に新しい値を見つけることができませんでした値は、計算が完了したが更新されていない...だから私は使用しようとするプライムフェイスのが動作しません。

あなたは一つの方法のロックを解除するためのアイデアを持っている場合を教えてください、または新たなソリューションを提案する=)あなたの助けのための

ありがとう!

イベントの順序を示すコンソールリターン。

>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

私はあなたと同じ問題を抱えていました。私はfilterFacturaUtilListがfilteredValue

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

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

... ... ... ... remotecommand使用

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

</h:outputScript> 

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

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

を解決しました

+0

パーフェクト、それはまさに私が必要なものです!ご協力いただきありがとうございます! =) –

+0

喜んで、あなたは1票を追加できます。 – meyquel

関連する問題