Comet とLift Frameworkを使用した学習実験として、単純な検索アプリケーションを構築しようとしています。計画では、テキスト エントリと検索結果用のスペースを備えたページを作成する予定です。検索用語が入力されると、それは ajax リクエストとして送信され、結果はサーバーによってプッシュバックされ、同じページにレンダリングされる必要があります。サーバーがさらに結果を見つけたら、それらをクライアントにプッシュする必要があります。
テンプレートとしてComet Chat Demoを使用して、次のテンプレートから ajax フォームと検索結果の両方をレンダリングする CometActor を用意しました。
<lift:comet type="SearchResults" name="Other">
<search:input><search:input /><input type="submit" value="Search" /></search:input>
<search:results>
<div>Results for: <search:tag /></div>
<div class="search-results">
<search:list>
<li><list:title /></li>
</search:list>
</div>
</search:results>
</lift:comet>
対応する SearchResults アクターは、これを 2 つの部分でレンダリングします: fixedRender
ajax フォームを生成しrender
、検索結果のレンダリングを担当します。
class SearchResults extends CometActor {
override lazy val fixedRender: Box[NodeSeq] = {
SHtml.ajaxForm(bind("search", findKids(defaultXml, "search", "input"),
"input" -> SHtml.text("", updateSearch _)))
}
private def updateSearch(tag: String) = Log.info("UpdateSearch: " + tag)
def render = {
bind("search", findKids(defaultXml, "search", "results"),
"tag" -> "MyTag", // TODO show actual search tag
"list" -> <ul><li>Entry</li></ul>) // TODO actual search results
}
}
原則として、このコードは機能しますが、検索ボックスが結果の下に表示され、予想される場所の上には表示されません。
これは、render
とfixedRender
が実行される順序に関係していると思います。このコードを変更して、検索ボックスを上部に配置するにはどうすればよいですか?