在我的基于StartApp软件包的应用程序中,我有一个端口可以从JS内部进行通信。目前我使用邮箱
调用此端口requestPalette :
{ address : Signal.Address String
, signal : Signal String
}
requestPalette = Signal.mailbox ""
requestPaletteFilter : Signal String
requestPaletteFilter =
Signal.filter (String.isEmpty >> not) "" requestPalette.signal
|> settledAfter (300 * Time.millisecond)
port request : Signal String
port request = requestPaletteFilter
并像这样使用它:
[on "input" targetValue (\str -> Signal.message requestPalette.address str)
我想知道update
函数内部是否存在这种方法,而不是从视图中发送消息。
答案 0 :(得分:5)
这适用于elm 0.16(及之前),在elm 0.17订阅已更改为端口
为了通过更新向邮箱发送信号,您需要使用StartApp
而不是StartApp.Simple
,因为前者允许{{1}中的效果功能。
至少,你可能会有这样的Action,它定义了No-Op和发送字符串请求的动作:
update
您的type Action
= NoOp
| SendRequest String
函数现在将包含类似以下新SendRequest操作的案例。由于您正在使用处理效果的StartApp,因此您必须调用update
,并且您要映射到效果的任务必须是Action类型,这就是我们拥有{{1返回值。
Effects.task
现在,视图中的点击事件处理程序可以返回使用传递给视图的Task.succeed NoOp
:
update action model =
case action of
NoOp ->
(model, Effects.none)
SendRequest str ->
let
sendTask =
Signal.send requestPalette.address str
`Task.andThen` (\_ -> Task.succeed NoOp)
in
(model, sendTask |> Effects.task)
我在this gist中得到了上述例子。您只需要在javascript中订阅address
端口即可查看其中的操作。