javascript - 通过端口将事件处理程序从 elm 传递到 JS

标签 javascript elm ffi

在 JS 中我们有一个这样的函数:

const handleClick = event => {
  event.preventDefault();
  // some more code
}

<button onClick={this.handleClick}>Add to bag</button>

我的榆树代码:

main.elm

port addToBag : Value -> Cmd msg

type Msg
  = ClickBag Item

update msg model =
  case msg of
   ClickBag item ->
      let
        data =
          Encode.object
            [ ("price", Encode.string item.price)
            , ("sku", Encode.string item.sku)
            ]
      in
        ( model, addToBag data )

view model =
  button [onClick ClickBag model.item] [text "Add to bag"]

index.html

<div id="elm"></div>

<script type="text/javascript">

  const addToBag = (params, btnSelector = null) => {
    console.log('json data', params)
  }

  const ElmApp = Elm.Main.init(document.getElementById('elm'))

  ElmApp.ports.addToBag.subscribe(addToBag)

</script>

目前,我可以获得 params 值,但不知道如何将事件处理程序(如 JS 代码中的 event)从 Elm 文件传递​​到 JS port(将该值传递给btnSelector), 所以我可以将该值用于遗留代码。有人可以帮助我吗?

非常感谢!

最佳答案

您可以将完整的事件对象提取为Value,并将其通过端口传递。

port toJS : Value -> Cmd msg

onClickWithValue : (Value -> msg) -> Attribute msg 
onClickWithValue toMsg =
    on "click" (Json.map toMsg Json.value)

并且在更新中有类似的内容

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        SomeTag value ->
            ( { model | count = model.count + 1 }, toJS value )

顺便说一句,如果你传递给JS的值是基本值(Bool、Int、Float、String、Maybe、Json.Decode.Value和List、Array、元组或前面类型的记录),你可以只需将它们作为记录传递即可。因此,就您而言,您可以:

type alias Item = 
    { price: String 
    , sku: String 
    }

port addToBag : (Item, Value) -> Cmd msg

type Msg
  = ClickBag Item Value

view model =
  button [onClickWithValue (ClickBag model.item)] [text "Add to bag"]

update msg model =
  case msg of
   ClickBag item value ->
        ( model, addToBag ( item, value ) )

关于javascript - 通过端口将事件处理程序从 elm 传递到 JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822308/

相关文章:

javascript - 当日期选择器单元格样式不可访问时如何更改它?

javascript - Firebase 云触发器功能 - 如何向所有用户发送通知?

elm - `Msg` 类型如何在 Elm 中分成多种类型?

将文件移动到子目录后,elm-make 找不到文件

c - unsafePerformIO 和 FFI 库初始化

Javascript forEach 返回 "undefined"作为对象变量

javascript - 如何添加过滤器: alpha using javascript?

design-patterns - elm 中的翻译模式是什么?

c - 是否有更惯用的方法来防止释放可选参数字符串?

string - 如何转换[i8; 88]有点刺耳