【问题标题】:elm: define subscription port with no parameterselm:不带参数定义订阅端口
【发布时间】:2017-01-16 15:08:16
【问题描述】:

有没有办法在 Elm 中定义一个不带参数的订阅端口?

类似:

port updateTime : () -> Sub msg

使用此代码,我收到“端口 'updateTime' 的类型无效”的错误

附上代码:

port updateTime : (String -> msg) -> Sub msg

它正在工作,但我不需要从 javascript 函数向 Elm 发送任何内容。

【问题讨论】:

    标签: elm elm-port


    【解决方案1】:

    您可以获得的最接近的可能是这样的:创建类似于您的示例的端口,但第一个参数为(() -> msg)

    port updateTime : (() -> msg) -> Sub msg
    

    假设您有一个不接受任何参数的UpdateTime Msg

    type Msg
        = ...
        | UpdateTime
    

    然后您可以像这样绑定到updateTime 订阅:

    subscriptions : Model -> Sub Msg
    subscriptions model =
        updateTime (always UpdateTime)
    

    现在,在 javascript 方面,您必须将 null 作为唯一参数传递。

    app.ports.updateTime.send(null);
    

    Elm 0.19 更新

    在 Elm 0.19 中,您必须明确哪些 Elm 模块暴露了端口,因此您可能需要更新模块定义以包含 port module

    port module Main exposing (main)
    

    【讨论】:

    • 这行得通。但我想知道为什么官方网站上没有关于此的文档?我在看guide.elm-lang.org/interop/javascript.html#ports,但在那里我找不到关于如何完成我的任务的东西(也没有提到总是)......而且很糟糕......没有关于 ELM 的书籍和不完整的文档......跨度>
    • 是的,这很糟糕,没有记录在案——我不得不阅读 Native 来了解它是如何被调用的。如果您不确定,可以尝试跳入运行时的核心。注意:榆木不是榆木。
    • 我可能搞砸了,但这适用于 0.19 吗?
    • 是的,这仍然适用于 Elm 0.19。 Here is a working example。唯一真正的区别是您必须在顶部将模块定义为port module
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2011-05-22
    • 2015-07-16
    相关资源
    最近更新 更多