2013-03-13 3 views
0

Я использую RichFaces и хочу реализовать прямой поиск на моем сайте. Я получил поле ввода и div, который динамически создавался в моем бэкбоне. На самом деле метод bean.getResultsDiv() вызывает setResultsDiv() и создает объект MyFaces Div с учетом searchString. К сожалению, если я набираю один символ в моем поле ввода, повторное преобразование результатов-div происходит слишком рано, и строка поиска не будет обновляться. Как убедиться, что обработка char происходит сначала, а затем активирован метод bean-метода для создания нового результата-div? Заранее спасибо.RichFaces LiveSearch on inputField

<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}" /> 

ДОПОЛНЕНО-1: Я отлажена и теперь я могу видеть, что bean.searchString правильно обновляется. К сожалению, getter-метод для getResultsDiv() вызывается перед 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: Я смог узнать, что получатель соответствующего привязки вообще не запускался, и поэтому нет никакой возможности, чтобы div был обновлен. Это проблема!

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

ответ

0

Кажется, вы хорошо находите. Обратите внимание на атрибут listener, связанный с методом process, который является трюком в этом примере. каждый keypress в строке поиска 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.

Извините, но у меня нет prime faces Я работаю над реализацией чистой Glassfish, но вы можете найти этот образец интересным, который работает аналогично вашему требованию.

Смежные вопросы