0

コンビネーターを使用して WebSharper フォームレットを作成しましたが、私の目標はそれを jQueryUI ポップアップに埋め込むことです。結果として、ユーザーが [いいえ] をクリックしたときにダイアログを閉じることができるようにする必要があります。以下は機能しません。

let confirmationForm order =
    let title = DialogConfiguration(Title = "Are you sure you want to place the order?")
    let form = Formlet.Return ()
                |> Enhance.WithCustomSubmitAndResetButtons
                    { Enhance.FormButtonConfiguration.Default with Label = Some "Yes" }
                    { Enhance.FormButtonConfiguration.Default with Label = Some "No" }
                |> Enhance.WithFormContainer
    let rec dialog = Dialog.New(Div [ result ], title)
    and result =
        Formlet.Do {
            let! _ = form |> Enhance.WithResetAction (fun _ -> dialog.Close(); true)
            dialog.Close()
            return Server.SubmitOrder order
        } |> Enhance.WithFormContainer

    (dialog :> IPagelet).Render()

Formlet.Do {
    let! order = orderForm
    return confirmationForm order
}
|> Enhance.WithFormContainer

はいをクリックすると、ダイアログは正常に閉じます。また、true を返す関数を提供する必要がある署名を理解していません。他のコールバックを提供する必要がないため、混乱を招きます。

また、Dialog の Div にワークフローを提供できる相互再帰関数をサポートしていることに、私は驚いたことに注意してください。私はこれを行うためのより良い方法があると思いますか?

ありがとう!

4

1 に答える 1

1

jQueryUI ダイアログ内に任意のフォームレットを表示するための一般化された関数を次に示します。

[<JavaScript>]
let InDialog (title: string) (formlet: Formlet<'T>) =
    Formlet.BuildFormlet <| fun _ ->
        let state = new Event<_>()
        let conf =
            JQueryUI.DialogConfiguration (
                Modal = true,
                DialogClass = "dialog",
                Title = title
            )
        let dialogOpt : ref<option<JQueryUI.Dialog>> = 
            ref None
        let el =
            Div [
                formlet
                |> Formlet.Run (fun confirmed ->
                    match dialogOpt.Value with
                    | Some dialog ->
                        state.Trigger (Result.Success confirmed)
                        dialog.Close()
                    | None ->
                        ()
                )
            ]
        let dialog = 
            JQueryUI.Dialog.New(el, conf)
        dialogOpt := Some dialog
        Div [dialog] , ignore , state.Publish

そしてそれを使用する例:

[<JavaScript>]
let Main () =
    Formlet.Do {
        let! _ =  Controls.Button "Display Form"
        let! name = 
            Controls.Input ""
            |> Enhance.WithSubmitAndResetButtons "Submit" "Reset"
            |> InDialog "Enter your name" 
        return ()
    }

ブール値の戻り値に関するご質問について。Enhance.WithResetAction について言及していると思います。この値は、アクションの実行後にフォームレットをリセットするかどうかを決定します。

于 2011-09-22T12:50:03.113 に答える