有条件地在Elm的表单提交上切换`preventDefault`

时间:2016-10-10 03:29:33

标签: elm

有没有办法在表单提交上有条件地切换preventDefault? 我已尝试使用下面的onWithOptions,但似乎只使用了第一个设置,即使我在模型上有名称时可以使用Debug.log看到它发生变化。

, onWithOptions
    "submit"
    (if model.name == "" then
        (Debug.log "prevent" { preventDefault = True, stopPropagation = True })
      else
        (Debug.log "allow" { preventDefault = False, stopPropagation = False })
    )
    (Json.succeed FormSubmit)

更新了答案

的结果

如@Tosh所述,隐藏按钮可以解决问题:

, button
    [ onPreventClickHtml FormSubmit
    , Html.Attributes.hidden (model.name == "" |> not) ]
    [ text " prevent" ]
, button
    [ onClick FormSubmit
    , Html.Attributes.hidden (model.name == "") ]
    [ text "allow" ]

onPreventClickHtml的位置:

onPreventClickHtml : Msg -> Attribute Msg
onPreventClickHtml msg =
    onWithOptions
        "click"
        { preventDefault = True, stopPropagation = True }
        (Json.succeed msg)

有条件地显示按钮 有效:

, (if model.name == "" then
    button
        [ onPreventClickHtml FormSubmit ]
        [ text " prevent" ]
  else
    button
        [ type' "submit", onClick FormSubmit ]
        [ text "allow" ]
  )

我使用elm-mdl因此发现实施解决方案更具挑战性,因为根据我的经验,创建自定义 onclick 需要elm-mdl未公开的类型,因此需要重复。

, if model.name == "" then
    Material.Options.nop
  else
    Material.Options.css "visibility" "hidden"
, onPreventClick FormSubmit

, if model.name == "" then
    Material.Options.css "visibility" "hidden"
  else
    Material.Options.nop
, Button.onClick FormSubmit



onPreventClick : Msg -> Property Msg
onPreventClick message =
    Material.Options.set
        (\options -> { options | onClick = Just (onPreventClickHtml message) })

-- Duplicated from elm-mdl
type alias Property m =
    Material.Options.Property (Config m) m

-- Duplicated from elm-mdl
type alias Config m =
    { ripple : Bool
    , onClick : Maybe (Attribute m)
    , disabled : Bool
    , type' : Maybe String
    }

另一种适用于我的场景的方法是更改​​按钮类型:

, if model.name == "" then
    Button.type' "reset"
  else
    Button.type' "submit"

1 个答案:

答案 0 :(得分:3)

一个简单的解决方法建议,直到有人可以向我们展示如何解决它。

如何创建两个按钮(如您所示,具有不同的选项)并根据条件仅显示其中一个? 您可以使用Html.Attributes.hide