0

私は RichFaces を使用しており、Web サイトにライブ検索を実装したいと考えています。入力フィールドと、バッキング Bean で動的に構築された div を取得しました。実際には、メソッド bean.getResultsDiv() が setResultsDiv() を呼び出し、searchString を考慮して MyFaces Div オブジェクトを作成します。残念ながら、入力フィールドに 1 つの文字を入力すると、results-div の再レンダリングが早すぎて、検索文字列が更新されません。char の処理が最初に行われ、次に新しい result-div を作成するための bean-method がトリガーされるようにするにはどうすればよいですか? 前もって感謝します。

<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: 対応するバインディングのゲッターがまったくトリガーされなかったため、div が更新される可能性がないことがわかりました。それが問題のようです!

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

1 に答える 1

0

順調に進んでいるようですね。このサンプルのトリックであるメソッドへの属性listenerバインディングに注意してください。検索文字列のprocessキー押下txtSearchStringを追跡し、processメソッドを呼び出す必要があります。これにより、入力コントロールの下のAjax ライブ検索パネルが更新されます。

フェイスレット:

<?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 に答える