2017-01-31 4 views
1

はここで先行入力と私のinputText制御が有効である:xPageでtypeAheadのパフォーマンスを向上させるにはどうすればよいですか?

<xp:inputText id="inputNameEditBox"> 
    <xp:typeAhead 
     mode="full" 
     minChars="3"   
     ignoreCase="true" 
     valueList="#{javascript:return mytypeAheadList();}" 
     var="searchValue" 
     valueMarkup="true" 
     id="typeAhead1"> 
    </xp:typeAhead> 
</xp:inputText> 

SSJS mytypeAheadList()関数は、提案のセットを取得するために、カスタムJava userTools.userLookup()関数を呼び出します。 (当社のサーバーは社内のディレクトリにアクセスできないため、LDAP HTTP Java APIを使用する必要があります)。

SSJSライブラリ:

function mytypeAheadList(){ 
    var v=new userTools.userLookup(); //Java library 
    var usrList = v.getUserList(searchValue); 
    var lenList = usrList.length; 
    var retList = "<ul>"; 

    if(lenList>0){ 
     for (var i=0; i<lenList; i++) { 
      var matchDetails:string = ["<li>",@Name("[ABBREVIATE]", @Left(usrList[i], "@")),"</li>"].join(""); 
      retList += matchDetails; 
     }  
    } else { 
     retList += ["<li>","None found","</li>"].join(""); 
    } 

    retList += "</ul>"; 
    return retList;  
} 

だからuserTools Javaオブジェクトは、その都度ユーザーが文字を入力作成されることを意味します。それを避ける方法はありますか?ページロード時にグローバル変数var vを作成しますか?スコープ変数がJavaオブジェクトを受け入れることができないようです。

+0

あなたのJavaオブジェクトは、直列化可能ですか? –

+0

いいえ、シリアル化できません – VladP

答えて

0

はい、あなたはそれを行うことができます。

var vのいずれかを関数の外に置くことで、ロードしたままにしておくことができます(ヌルであるかどうかを調べることで初めて遅延ロードする)。

または、すべてをJava Beanに入れて、データの保持期間をBeanのスコープで決めることができます。このページのViewScope - ApplicationScopeを使用すると、すべてのユーザーが共有できますxx分の最大の年齢を強制的にチェックする - これは、あなたが調べるデータが変わる可能性があるかどうかを検討することに関連する可能性があります)。

1

私は、次の操作を行います:

  1. getUserLookupによって返されたあなたのPOJOへシリアライズインターフェイスを実装します。これにより、オブジェクトをに保存することができます。ビュースコープ
  2. lenlistの最大サイズを制限します。例えば。 20の結果は、ループの時間、HTTP応答のサイズ、およびブラウザのパフォーマンスを低下させます。
  3. 検索の結果をキャッシュします(searchValueと結果のHTML文字列をマップに追加します)。ユーザーがバックスペースにヒットした場合、結果全体を再計算しないでください。
  4. Drop SSJS。 Javaを使用します。
  5. オプション:可能であれば、結果を事前に計算します。このよう

EDIT 何か:

function mytypeAheadList(){ 

    // check if value is already cached 
    if(viewScope.containsKey("search~" + searchValue)){ 
     return viewScope.get("search~" + searchValue); 
    } 

    // get the userLookup object 
    var v = null; 
    if(viewScope.containsKey("userLookup")){ 
     v = viewScope.get("userLookup"); 
    }else{ 
     v = new userTools.userLookup(); 
     viewScope.put("userLookup", v); 
    } 

    // if usrList is "unlimited", limit the max size 
    var usrList = v.getUserList(searchValue); 
    var lenList = usrList.length > 20 ? 20 : usrList.length; 

    // if getUserList has a restriction parameter 
    var usrList = v.getUserList(searchValue, 20); 
    var lenList = usrList.length; 

    // build the list 
    var retList = null; 

    // reuse a variable is up to 2 times faster 
    var matchDetails = null; 

    if(lenList>0){ 
     retList = "<ul>"; 
     for (var i=0; i<lenList; i++) { 
      // concatenating a string is up to 2 times faster then join 
      matchDetails = "<li>" + @Name("[ABBREVIATE]", @Left(usrList[i], "@")) + "</li>"; 
      retList += matchDetails; 
     } 
     retList += "</ul>"; 
    } else { 
     // why join a static string? 
     retList = "<ul><li>None found</li></ul>"; 
    } 


    // put the result to the cache 
    viewScope.get("search~" + searchValue, retList); 

    return retList;  
} 
関連する問題