我无法掌握以下功能声明&榆树语言的定义语法。
keyDown: (Int -> Msg) -> Attribute msg
keyDown event =
on "keydown" (Json.map event keyCode)
第一行是什么意思?
keyDown: (Int -> Msg) -> Attribute msg
。是否意味着,keyDown
功能需要Int
& Msg
类型参数&返回类型Attribute
?
功能定义部分究竟发生了什么?
如何定义函数的参数?
答案 0 :(得分:4)
keyDown
函数接受另一个函数作为参数并返回一个属性,Elm的渲染器使用该属性来附加事件监听器。
如果您定义类型
type Msg
= KeyDown Int
KeyDown
充当Msg
类型值的构造函数,所以我们可以说它的隐式类型是KeyDown: Int -> Msg
,这就是你想要的从DOM事件中检索密钥代码。
首先,我必须说正确的实现应该是这样的:
keyDown : (Int -> msg) -> Attribute msg
keyDown tagger =
on "keydown" (Json.Decode.map tagger keyCode)
在签名中包含msg
类型变量很重要,因此可以在应用程序的不同部分使用此事件侦听器,其中Html
发出不同类型的{msg
1}}
要了解这里发生的事情,让我们仔细看看Html.Events.on
on : String -> Decoder msg -> Attribute msg
每个DOM事件都表示为具有某些字段的JavaScript对象。要从JavaScript检索数据,Elm需要通过Decoder传递它以确保运行时的类型安全,就像HTTP请求一样。
on
中的解码器应该生成与属性本身相同类型的消息。
默认情况下,keyCode解码器会解码Int
值,但我们想要的是发出一些消息。
Json.Decode.map帮助我们获取Int
并应用一些产生消息的tagger
函数。
整个(Json.map event keyCode)
部分基本上是Decoder msg
,它应用于事件对象以提取密钥代码和"标记"它留言。