2013-03-13 66 views
0

我正在使用RichFaces並希望在我的網站上實施實時搜索。我有一個輸入字段和一個在我的支持bean中動態構建的div。實際上,方法bean.getResultsDiv()調用setResultsDiv()並考慮searchString創建MyFaces Div對象。不幸的是,如果我在輸入字段中鍵入一個字符,結果div的重新渲染髮生得太早,搜索字符串將不會更新。如何確保char的處理先發生,然後創建新的result-div的bean方法被觸發?提前致謝。在inputField上的RichFaces LiveSearch

<t:inputText id="mysearchString" 
    value="#{bean.searchString}" 
    onkeydown="jQuery('form_processSearchString').click();" 
/> 
<4j:commandButton id="processSearchString" 
    process="mysearchString" 
    reRender="results" 
/> 
<t:div id="results" binding="#{bean.resultsDiv}" /> 

UPDATE-1:我調試了,現在我可以看到bean.searchString已正確更新。不幸的是getResultsDiv()的getter方法在setSearchString(newStringToSeach)之前被調用。我如何確保處理先發生然後再處理。

另一個代碼段我與玩弄(相同的行爲,重新描繪-消氣呼叫setSearchString之前觸發()):

<t:inputText id="searchString" 
    value="#{beans.searchString}" 
    onkeydown="if (event.keyCode == 13) { return false; }"> 
    <a4j:support event="onkeyup" requestDelay="200" ajaxSingle="true" 
     reRender="resultsDiv" eventsQueue="quicksearchqueue" 
     ignoreDupResponses="true" 
     process="searchString" 
    /> 
</t:inputText> 

感謝您的幫助!

UPDATE-2:我能夠發現相應綁定的getter沒有被觸發,因此div不會被更新。這似乎是問題!

<t:div id="results" binding="#{bean.resultsDiv}" /> 

回答

0

看起來你很好的發現。 請注意綁定到process方法的屬性listener,這是本示例中的技巧。 每個按鍵在搜索字符串txtSearchString應跟蹤和process方法需要調用。這將更新輸入控件下方的Ajax實時搜索面板

的facelet:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

<h:head> 
    <title>TODO supply a title</title> 
</h:head> 
<body> 
    <h:form> 
     <h:inputText id="txtSearchString" value="#{lively.seStr}"> 
      <f:ajax event="keypress" render=":result" execute="@form" listener="#{lively.process()}"/>     
     </h:inputText> 
    </h:form> 
    <h:outputFormat id="result" value="#{lively.liveMsg}"/> 
</body> 
</html> 

Mmanaged豆:

import javax.inject.Named; 

import javax.enterprise.context.SessionScoped; 

import java.io.Serializable; 

@Named(value = "lively") 
@SessionScoped 
public class lively implements Serializable { 

private String seStr = ""; 
private String liveMsg = "...."; 
private int livelyID = 0; 

public String getLiveMsg() { 
    return liveMsg; 
} 

//public void setLiveMsg(String liveMsg) { 
// this.liveMsg = liveMsg; 
//} 

public String getSeStr() { 
    return seStr; 
} 

public void setSeStr(String seStr) {   
    this.seStr = seStr; 
} 

public lively() { 

} 

public void process() { 
    //initialize 
    if (seStr.length() == 0) 
     livelyID = 0; 

    //access the search string   
    liveMsg = seStr + " - "; 

    //do some work 
    livelyID++; 
    if (livelyID <= 10) { 
     liveMsg = "less than 10"; 
    } else if (livelyID > 10 && livelyID <= 20) { 
     liveMsg = "more than 10"; 
    } else { 
     liveMsg = "more than 20"; 
    } 
} 
} 

只需將豆和facelet裏添加到JSF項目和運行的facelet。

對不起,我沒有素面我在純Glassfish實現上工作,但你可能會發現這個示例有趣,其作用類似於你的要求。