首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >inputField上的RichFaces LiveSearch

inputField上的RichFaces LiveSearch
EN

Stack Overflow用户
提问于 2013-03-14 00:46:27
回答 1查看 391关注 0票数 0

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

代码语言:javascript
复制
<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被正确更新了。不幸的是,在setSearchString(newStringToSeach)之前调用了getResultsDiv()的getter-method。如何确保先进行处理,然后再进行重新渲染。

我正在使用的另一个代码片段(相同的行为,在setSearchString()之前触发重新渲染-getter-call):

代码语言:javascript
复制
<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>

感谢您的帮助!

更新-2:我发现相应绑定的getter根本没有被触发,所以div不可能被更新。这似乎是问题所在!

代码语言:javascript
复制
<t:div id="results" binding="#{bean.resultsDiv}" />
EN

回答 1

Stack Overflow用户

发布于 2013-03-15 14:03:25

看起来你找到了很好的方法。注意绑定到process方法的属性listener,这是本示例中的诀窍。应该跟踪搜索字符串txtSearchString中的每个按键,并且需要调用process方法。这将更新输入控件下面的Ajax live搜索面板。

面孔:

代码语言:javascript
复制
<?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>

托管bean:

代码语言:javascript
复制
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即可。

对不起,我没有prime faces,我在纯Glassfish实现上工作,但你可能会发现这个样本很有趣,它的工作原理类似于你的需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15391437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档