Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elm 单向javascript通信_Elm - Fatal编程技术网

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
,这意味着它实际上不会产生大写的M
msg
;事实上
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”“
。谢谢