2017-01-26 35 views
0

我有一個數據表(primefaces 4.0),並且我正在使用widgetVar在更新數據後應用重新篩選表。 只有當employeesDataTable_WV.filter();真的完成過濾表並更新它時,我才需要調用函數doSomething()在widgetVar.filter()完成之後做一些事情,並且已經更新了p:datatable

在這個環節是展示如何工作filter功能

https://searchcode.com/codesearch/view/2686053/

似乎做一個Ajax請求,比更新組件。

這裏我舉的例子代碼

<h:form id="form"> 

    <p:remoteCommand name="myRemote" actionListener="viewEmployeesManagedBean.refreshEmployees" 
      update=":form:employeesDataTable" 
      oncomplete="employeesDataTable_WV.filter();doSomething();"/> 

    <p:dataTable id="employeesDataTable" 
     value="#{viewEmployeesManagedBean.employees}" var="employee" widgetVar="employeesDataTable_WV"> 
     [...] 
    </p:dataTable> 
    </h:form> 

我需要調用DoSomething的功能是過濾後,僅數據表和更新employeesDataTable_WV.filter()函數。 我的所有測試都不起作用,在更新數據表之前總是調用doSomething函數。

非常感謝您的幫助。

回答

1

你應該做的是一個AJAX事件處理程序添加到p:dataTable,把doSomething()在過濾器事件的oncomplete,並從p:remoteCommand刪除它。

<p:ajax event="filter" oncomplete="doSomething()" /> 

如果你不想/需要有一個往返到服務器,你可以更換p:ajax與PrimeFaces擴展

如果你只希望它發生時,filter()直接調用在widgetVar上,只需在調用filter()之前直接設置一個信號量,如果已設置,請檢查doSomething()

<p:remoteCommand ... 
     oncomplete="mySemaphore = true;employeesDataTable_WV.filter();"/> 

function doSomething() { 
    if(mySemaphore == true;) { 

     ... 

     mySemaphore = false; 
    } 

    // just do nothing if called from editing in one of the filter fields 
} 

這應該適用於4.0也爲以後的版本上升到目前(在回答的時候)6.1快照(最有可能超越)

參見

+0

對不起,但這樣也抓住了用戶在列過濾器上鍵入東西的時刻 ' \t \t \t \t \t \t \t的 \t \t \t \t \t \t的 \t \t' 這是真的還是我錯了? 我不想要這樣的行爲 – HouseFragance

+0

正確,那是你唯一的意思嗎?然後在遠程命令的完成之前在employeesDataTable_WV.filter();'set a'semaphore '和'doSomething()'首先檢查是否已設置。如果不是直接從它返回,否則實際上做一些事情。 – Kukeltje

相關問題