私はajax+cometを使用して反復フォームを作成しています。送信すると、出力ファイルがダウンロードされます。
def render = ajaxForm(bind("form",/*...*/
"submit" -> ajaxSubmit("Calculate",result _)))++hidden(result _)
private def result : JsCmd = {
/* Some really time-consuming calculations */
JsCmds.RedirectTo("/result/"+uniqueId)
}
ほとんどの場合に機能します。ただし、計算が非常に長く続くため、「サーバーが応答できませんでした」というメッセージが表示されます(エラーメッセージが表示されずにリダイレクトされない場合もあります)。
ajaxタイムアウトを再構成しようとしました:
LiftRules.ajaxPostTimeout = Int.MaxValue
しかし、それでもリダイレクトされていません。
また、リダイレクト部分を計算から切り離して、次のようなことを行うこともできます。
{val func = ajaxInvoke({() => JsCmds.RedirectTo("/result/"+uniqueId)})._2.cmd
Script(OnLoad(func))}
ただし、ページ全体のリロードだけでなく、reRenderでも機能するものにOnLoadを置き換える必要があります。または、クライアントを繰り返さずにページを強制的にリロードすることもできます。