如何解决从 PureScript Flame 应用程序接收信号
我正在尝试更好地理解 PureScript 通道和信号,特别是它们与 UI 库 Flame 的使用。
我创建了以下内容作为一个小例子:
module Main where
import Prelude
import Effect (Effect)
import Flame (Html,QuerySelector(..))
import Flame.Application.NoEffects as FAN
import Flame.HTML.Attribute as HA
import Flame.HTML.Element as HE
data Message
= ButtonOne
| ButtonTwo
type Model
= { buttonOneCount :: Int,buttonTwoCount :: Int
}
init :: Model
init =
{ buttonOneCount: 0,buttonTwoCount: 0
}
update :: Model -> Message -> Model
update model message = case message of
ButtonOne -> model { buttonOneCount = model.buttonOneCount + 1 }
ButtonTwo -> model { buttonTwoCount = model.buttonTwoCount + 1 }
view :: Model -> Html Message
view model =
HE.main "main"
[ HE.button [ HA.onClick ButtonOne ] "Button One",HE.p_ ("button one: " <> show model.buttonOneCount),HE.button [ HA.onClick ButtonTwo ] "Button Two",HE.p_ ("button two: " <> show model.buttonTwoCount)
]
main :: Effect Unit
main = do
-- flameChannel :: Channel (Array Message)
flameChannel <-
FAN.mount (QuerySelector "main")
{ init,update,view }
pure unit
我知道应该在 update
中处理任何更改,但作为实验,我想订阅 flameChannel
中对 main
的更改并运行一些基于代码的在 Message
火焰通过该通道发送。
刚刚开始,当用户单击按钮 1 或按钮 2 时,可以添加什么来将此输出添加到 JavaScript 控制台,使用 flameChannel
中的 main
?
我尝试过使用 purescript-signal
中的各种函数组合:subscribe
、runSignal
、get
,但一无所获。我还查看了 GitHub 上使用 purescript-signal
库的各种游戏,但它们似乎只是将 runSignal
放入代码中,一切正常,我不明白为什么(而且,这些示例是有点复杂,远不是我想要做的)。
解决方法
好吧,让我们看看 - 正如您已经注意到的那样,您会收到一个 Channel
(来自信号),它会通知您关于 Message
s
您现在应该可以使用 Signal.Channel.subscribe
将其转换为 Signal
现在 Signal
的工作方式是您应该提供一个 Signal
signaling Effect
s(那些将被执行/运行)到} - 所以你必须先把 runSignal
变成 Signal (Array Message)
。
幸运的是 Signal (Effect Unit)
是 Signal
,因此您可以使用 Functor
或提供的 map
(翻转 ~>
)来执行此操作。我建议先使用 flattenArray
让您的生活更轻松:
map
并在logMessage :: Message -> Effect Unit
logMessage msg =
case msg of
ButtonOne -> log "button one"
ButtonTwo -> log "button two"
中:
main
这应该有效
免责声明:我没有尝试编译这个 - 如果你有任何问题,请报告,我会注意
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。