WebSharper's Enhance.WithResetAction - PullRequest
       9

WebSharper's Enhance.WithResetAction

0 голосов
/ 20 сентября 2011

Я создал бланк 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, что немного сбивает с толку, поскольку мне не нужно предоставлять какой-либо другой обратный вызов.

Кроме того, обратите внимание, что я положительно удивлен, что этоподдерживает взаимно рекурсивную функцию, позволяющую обеспечить рабочий процесс для Div диалога.Я предполагаю, что есть лучший способ сделать это, хотя?

Спасибо!

1 Ответ

1 голос
/ 22 сентября 2011

Вот обобщенная функция для отображения любой формы в диалоге 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.Значение определяет, будет ли сброшена формула после выполнения действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...