2011-10-25 43 views
4

我有一個h:inputText標籤內的f:ajax標籤上的keyup事件進行Ajax調用:取消JSF ajax調用

<h:inputText id="searchinput" value="#{tvShowForm.name}"> 
    <f:ajax event="keyup" render="results" listener="#{tvShowForm.search}" /> 
</h:inputText> 

每個電話會花足夠的時間第一次調用結束前,用戶鍵入幾個字符。

有沒有辦法取消當前的ajax調用(和排隊的),以便最後一個keyup事件立即執行ajax調用?

回答

4

聽起來好像你想合併事件,例如在發射ajax請求之前半秒鐘等待 ,並且包含在該點輸入的任何輸入。但是你不會爲輸入的每個字符 發起ajax請求。

<h:inputText onkeyup="keyupHandler();"/> 
    ... 
    <script> 
    var keystrokeTimeout; 

    keyupHandler = function(event) { 

     var minChars = 4; 
     var len = $(this).val().length; 
     if((len != 0) && (len < minChars)) { 
      return; 
     } 

     var ajaxRequest = function() { 
      jsf.ajax.request('results', null, { 
       execute: 'results', 
       render: 'results' 
      }); 
     } 
     clearTimeout(keystrokeTimeout); 
     keystrokeTimeout = setTimeout(ajaxRequest, 500); // millisecs 
    } 
    </script> 

這是遠程就像你想要做的?

編輯:另一個建議是,你簽出Richfaces 4 a4j:隊列功能。 這允許組合事件,例如在鍵盤場景中,如果您已依靠鍵盤上的 ,當前ajax請求完成後,只會再發送一次 請求。也可以指定請求延遲,並忽略陳舊的響應 響應。 Richfaces並沒有做出這樣的重大錯誤(那就是primefaces確實是),因爲RF使用與JSF實現相同的底層隊列,所以你沒有風險 的無序處理。

我明白如果你還沒有使用這個庫,這不是一小步。

+0

感謝Oversteer,這正是我在此期間最終做的^^。 如果沒有更好的解決方案在幾天內發佈,我會堅持下去並獎勵您的賞金。 – kgautron