Elm 单向javascript通信
我想编写一个Elm 单向javascript通信,elm,Elm,我想编写一个Cmd,它会导致一些javascript运行,但不会返回到系统中 比如: update msg model = case msg of AlertTime -> (model, alertTime) 请注意,alertTime将生成一个Cmd,调用一些javascript函数来提醒用户当前时间,但我不需要任何东西返回elm运行时。我不是要解决生成当前时间警报的问题,只是想说明我要解决的问题 如何根据elm体系结构促进与javascr
Cmd
,它会导致一些javascript运行,但不会返回到系统中
比如:
update msg model =
case msg of
AlertTime ->
(model, alertTime)
请注意,alertTime
将生成一个Cmd
,调用一些javascript函数来提醒用户当前时间,但我不需要任何东西返回elm运行时。我不是要解决生成当前时间警报的问题,只是想说明我要解决的问题
如何根据elm体系结构促进与javascript的单向通信?我可以编写一个本机模块,在函数调用中实现这一点,但我觉得这是在回避elm体系结构 您正在寻找的功能是
端口
。将模块声明为端口模块
(即,将文件顶部的模块
替换为端口模块
),并声明传出端口:
port alert : String -> Cmd msg
这定义了一个Elm函数alert
,它接受一个String
并生成一个命令。(请注意,它是一个Cmd msg
,小写msg
,这意味着它实际上不会产生大写的Mmsg
;事实上msg
是小写表示它是一个类型变量,警报“blah”
将可从任何更新函数返回,无论具体的msg
类型如何。)
在JavaScript中,您可以编写如下内容:
app.ports.alert.subscribe(function(str) {
alert(str);
});
view model =
input [type_ "button", attribute "onClick" "javascript:your_function()" ] []
该代码“订阅”Elm代码发送到警报
端口的消息——不要将其与Elm订阅
混淆,后者侦听发送到Elm的消息
现在,在Elm中,您可以创建类似于警报“Hi there”
的命令。当执行该命令时,该命令将调用您在Javascript中定义的函数,导致出现一个带有文本“Hi there”
的警报
请注意,您不能在没有参数的情况下声明,例如,
alertTime:Cmd msg
。您可以声明alertTime:()->Cmd msg
,并通过从更新函数返回alertTime()
来使用它。如果您的Javascript函数接受输入,我相信这将向Javascript发送值[]
。如果您想将其附加到事件(例如onClick
),您可以(ab)使用属性函数,如下所示:
app.ports.alert.subscribe(function(str) {
alert(str);
});
view model =
input [type_ "button", attribute "onClick" "javascript:your_function()" ] []
elm
不会解析返回值,这在您的情况下很好啊,所以它必须接受一个参数。我不断收到错误信息,我的sig类型不正确,如alertTime:Platform.Cmd.Cmd x
,我想“不,这就是我想要的”。酷,所以现在我必须:doalertime:String->Cmd x
和alertTime=doalertime”“
。谢谢