一种方式 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 Msg
;msg
是小写的事实表明它是一个类型变量,并且 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 值,这在您的情况下没问题
我想写一个 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 Msg
;msg
是小写的事实表明它是一个类型变量,并且 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 值,这在您的情况下没问题