我正在使用RichFaces,并希望在我的网站上实现实时搜索。我有一个输入字段和一个div,它是在后台bean中动态构建的。实际上,方法bean.getResultsDiv()调用setResultsDiv()并根据搜索字符串创建MyFaces Div对象。不幸的是,如果我在输入字段中键入一个字符,那么resultdiv的重新呈现就会过早发生,并且搜索字符串不会更新。如何确保首先处理字符,然后触发用于创建新结果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(newstringtosearch)之前被调用。我怎样才能确保先处理然后再渲染呢?
我正在玩的另一个代码片段(相同的行为,在setSearchString()之前触发rerender -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}" />
看来你找得很顺利。注意,属性listener
绑定到process
方法,这是本示例中的技巧。搜索字符串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 bean:
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实现,但你可能会发现这个例子很有趣,它的工作原理类似于你的要求