OK、それではまず、Lift フォームをバインドする bind( ... ) の方法が先週のものであることを認めるところから始めましょう。:) 私はそれを知っています、そして私はまだこのコードを更新するために戻っていません. また、これを行うための非常に洗練された Lifty の方法があると信じています。それが私が求めるものです。何かを一緒にハックする方法でさえ、私は困惑しています。それは言った...
最初に編集不可で表示する項目のリストがあり、各項目のタイトルは ajax 対応のリンクであり、サーバーを呼び出し、その項目を編集可能な形式の項目に置き換えます (私は SetHtml を使用して交換します)。その項目をリストした < li> のフォーム)。「親」アイテムリストビューは次のようになります
< form data-lift="form.ajax">
< div data-lift="creategamewizard?multipart=true" id="wizardform">
< ul>
< li>項目 1</li>
< li>項目 2</ / li>
< /ul>
その他のフォーム要素
< button>送信</button>
< input type="hidden" id='298356928734' />
< /div>
< form>
この ajax 送信 (隠しフィールド経由) は、processSubmit() を呼び出します。
editableItem フォームでスワップする SetHtml は次のようになります。
注: 次のリストの最後では、「親」送信ボタンが既にページにあるため、「保存」バインディングにはサーバー側のコードが関連付けられていません。このバインディングに別の非表示フィールドを配置したり、任意のコードを Edit Item Save ボタンに直接結びつけると、そのコードと「親」送信がトリガーされます。したがって、以下のアプローチは、親の送信とアイテムの編集の送信の両方に「親」の送信を使用しようとすることでした。
<a href="javascript://" onclick={ajaxOnClickHandler(editItemClickHandler(item.id.get))}>{item.title.get}</a>
def ajaxOnClickHandler(jsHandler: ()=>JsCmd) =
{
SHtml.onEvent( e => jsHandler()).toJsCmd+";return false;"
}
def editItemClickHandler(itemId: String): ()=>JsCmd = ()=>
{
trace.logAjaxComm("ExistingItem.Edit()")
JsCmds.SetHtml("LiId"+itemId, getEditableItem(promo) )
}
def getEditableItem(itemId) =
{
bind( ...
"promotitle" -> SHtml.text(editablePromo.get.promotitle.is,
(s:String) => {
trace.logUIDataManipulation("Saving new promo Title["+s+"]");
editablePromo.get.promotitle(s)
}, "id" -> "promotitle"),
"save" -> SHtml.button("Save", ()=> {})
)
}
次に、ユーザーが項目を選択し、編集可能な項目フォームがプラグインされると、その項目のフォーム データを ajax 送信し、(現在更新されている) 非編集可能バージョンのデータに戻す「別の」送信ボタンがあります。
私にとっての問題は提出です。上記の [アイテムの編集] フォームに加えて、編集不可の「親」リスト ページに、リストの下のいくつかのフィールドの送信を処理する ajax 化された送信ボタンがあります。Edit Item "save"-> バインディングはボタンを追加します。ボタン自体は何もしないはずですが (実際には何もしません)、「Parent」送信ボタンをトリガーします。そして、その送信をルーティングして、[アイテムの編集] フォームを保存します。
編集不可のアイテムと編集可能なアイテムのコードは正常に交換されますが、編集可能なアイテムのフォームで行われた変更は保存されません。編集可能なアイテムのフォームの要素がまったく送信されていないために、それが起こっていることがわかりました。まったく表示されないログメッセージの例...
bind( ... "promotitle" -> SHtml.text(editablePromo.get.promotitle.is,
(s:String) => {
trace.logUIDataManipulation("Saving new promo Title["+s+"]");
editablePromo.get.promotitle(s)
}, "id" -> "promotitle")
)
通常の ajax 化されたフォームでは、すべての要素ハンドラーがレンダリングの順序で呼び出され (フィールドに変更があった場合、おそらく...)、submit/hidden 要素のハンドラーが最後に呼び出されます (それらが最後にある場合)。バインド リスト。
最後に、私の質問に取り掛かりましょう: このようなインプレース編集を行っている場合、2 つの送信ボタン (編集不可のリスト ページ用のボタンと、アイテムの編集時に追加される追加のボタン) を管理するにはどうすればよいですか? )? ページを更新する必要はないと確信していますが、Ajax でこれを行う方法がわかりません。または、代わりに、インプレース編集可能なフォームを送信しない ajax アクションとして送信することもできます。どういうわけか、親の送信をトリガーしませんか?