我想写一个Cmd
导致一些javascript运行,但从未有一个返回系统的值。
类似的东西:
update msg model =
case msg of
AlertTime ->
(model, alertTime)
请注意,alertTime
会生成Cmd
调用某个javascript函数来提醒用户当前时间,但我不需要任何东西来回到elm运行时。我并没有试图解决产生当前时间警报的确切问题,而只是为了说明我试图解决的问题。
如何根据elm架构促进与javascript的单向通信?我可以编写一个在函数调用中执行此操作的本机模块,但我觉得它绕过了榆树架构。
答案 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
不会解析返回值,这在您的情况下很好