一种方式javascript通信

时间:2017-10-24 03:36:48

标签: elm

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

类似的东西:

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

请注意,alertTime会生成Cmd调用某个javascript函数来提醒用户当前时间,但我不需要任何东西来回到elm运行时。我并没有试图解决产生当前时间警报的确切问题,而只是为了说明我试图解决的问题。

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

2 个答案:

答案 0 :(得分:3)

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

port alert : String -> Cmd msg

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

在JavaScript中,你会写这样的东西:

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

该代码“订阅”由Elm代码发送到alert端口的消息 - 不要将此与Elm subscriptions混淆,后者会监听正在发送的消息 < / em>榆树。

现在,在Elm中,您可以创建alert "Hi there"之类的命令。执行时,该命令将调用您在Javascript中定义的函数,从而导致警报显示为文本"Hi there"

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

答案 1 :(得分:0)

如果您想将其附加到某个活动(例如onClick),您可以(ab)使用attribute这样的功能:

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

elm不会解析返回值,这在您的情况下很好