一种方式 javascript 沟通

One way javascript communication

我想写一个 Cmd 导致一些 javascript 到 运行 但从来没有返回到系统的值。

类似于:

update msg model =
    case msg of
        AlertTime ->
          (model, alertTime)

注意 alertTime 会生成一个 Cmd 调用一些 javascript 函数来提醒用户当前时间,但我不需要任何东西来返回榆树运行时间。我并不是要解决生成当前时间警报的确切问题,它只是为了说明我要解决的问题。

如何根据榆树架构促进与 javascript 的单向通信?我可以编写一个在函数调用上执行此操作的本机模块,但我觉得这是在绕过榆树架构。

您要查找的功能是 ports。将您的模块声明为 port module(即,将文件顶部的单词 module 替换为 port module),并声明传出端口:

port alert : String -> Cmd msg

这定义了一个 Elm 函数 alert,它接受一个 String 并产生一个命令。 (请注意,它是 Cmd msg,小写 msg,这意味着它实际上不会导致大写 M Msgmsg 是小写的事实表明它是一个类型变量,并且 alert "blah" 将从 any 更新函数返回,无论具体的 Msg 类型如何。)

在 JavaScript 中,你会这样写:

app.ports.alert.subscribe(function(str) {
    alert(str);
});

该代码 "subscribes" 到 Elm 代码发送到 alert 端口的消息——不要将它与 Elm subscriptions 混淆,后者监听正在发送的消息 榆树.

现在,在 Elm 中,您可以创建像 alert "Hi there" 这样的命令。执行时,该命令将调用您在 Javascript 中定义的函数,导致出现带有文本 "Hi there".

的警告

请注意,您不能在不带参数的情况下声明,例如 alertTime : Cmd msg。您 可以 声明 alertTime : () -> Cmd msg,并通过从您的更新函数返回 alertTime () 来使用它。我相信如果您的 Javascript 函数接受输入,这将发送 Javascript 值 []

如果你想将它附加到一个事件(例如 onClick),你可以(滥用)使用 attribute 函数,如下所示:

view model =
    input [type_ "button", attribute "onClick" "javascript:your_function()" ] []

elm 不会解析 return 值,这在您的情况下没问题