0

我正在使用 RichFaces 并希望在我的网站上实现实时搜索。我有一个输入字段和一个在我的支持 bean 中动态构建的 div。实际上,方法 bean.getResultsDiv() 调用 setResultsDiv() 并考虑到 searchString 创建 MyFaces Div 对象。不幸的是,如果我在输入字段中键入一个字符,结果 div 的重新呈现发生得太早,并且搜索字符串将不会更新。如何确保首先处理 char,然后触发创建新结果 div 的 bean 方法?提前致谢。

<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() 之前触发了 rerendering-getter-call):

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

1 回答 1

0

看来你很顺利。listener请注意绑定到方法的属性process,这是此示例中的技巧。应跟踪搜索字符串中的每个按键并调用方法。这将更新输入控件下方的Ajax 实时搜索面板。txtSearchStringprocess

小面:

<?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>

托管豆:

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

只需将 bean 和 facelet 添加到 JSF 项目并运行 facelet。

抱歉,我没有从事纯 Glassfish 实现的主要面孔,但您可能会发现此示例很有趣,它与您的要求相似。

于 2013-03-15T06:03:24.793 回答