Elm中具有onInput的几个输入和参数
我正在用榆树做一点实验。现在我在屏幕上有几个输入范围,我想单独控制它们的值,但我不知道如何区分它们(在Js中,我会在onInput回调上发送输入的ID和值),因为我只能用Elm的onInput发送一个参数Elm中具有onInput的几个输入和参数,elm,Elm,我正在用榆树做一点实验。现在我在屏幕上有几个输入范围,我想单独控制它们的值,但我不知道如何区分它们(在Js中,我会在onInput回调上发送输入的ID和值),因为我只能用Elm的onInput发送一个参数 inp : Input -> Html Msg inp inp = div [ class "input" ] [ p [] [ text inp.name ] , input [ id (toString inp.id), type' "rang
inp : Input -> Html Msg
inp inp =
div [ class "input" ]
[ p [] [ text inp.name ]
, input [ id (toString inp.id), type' "range", value inp.volume, onInput ChangeInput ] []
, controls inp.name inp.id
]
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
Play id ->
( play model id, Cmd.none )
ChangeInput id value ->
-- Here I want to grab the id and the value coming from the input --
NoOp ->
( model, Cmd.none )
有什么帮助吗?
谢谢 使用部分应用程序:
onInput您的消息定义应该是:
type Msg =
...
| ChangeInput Id String
这给它一个签名(Id->String->Msg)
。
它接受Id
和String
并返回Msg
。消息包括id和字符串
您可以通过在视图中进行以下更改来提供自己的附加参数:
onInput (ChangeInput id)
公式(ChangeInput id)
是一个部分应用程序:
您不提供所有参数,而只提供一个参数,因此结果将是一个函数,该函数接受其余参数,并输出Msg
类型
您已经为消息(Id->String->Msg)
提供了Id
,因此剩余的签名将是(String->Msg)
,这正是onInput
所要寻找的。定义联合类型时,您将同时定义:类型注释定义和值构造函数
type Msg
=NoOp
|SomeMessage Int字符串
联合类型注释定义
在这里,您将使用Msg
为以下函数定义类型注释定义:
update:Msg->Model->(Model,Cmd-Msg)
联合类型值构造函数
然后,您将使用NoOp
和SomeMessage
作为Msg
下面是一个函数示例,它构造一个SomeMessage
值并返回它:
createSomeMessage:Int->Msg
createSomeMessage编号=
“你好!”
createSomeMessage 1--SomeMessage 1“你好!”
具有部分应用程序的联合类型值构造函数
Elm支持部分应用程序,这意味着您可以等待Msg
type的值的构造,直到您拥有所有必需的参数
以下是它的工作原理:
--部分应用的值构造函数,需要新参数
messageWithId:String->Msg
messageWithId=
消息1
{-稍后在视图中,(SomeMessage 1)将等待来自
输入DOM事件
-}
输入[onInput messageWithId][]
--表达同一事物的另一种方式:
输入[onInput(SomeMessage 1)][]
上面的示例显示了如何在DOM事件触发之前使用值构造函数应用一些参数。这将导致生成一条消息,其中包含来自部分应用函数和事件本身的数据
这里有一种被描述的实用技术。编译器这样说:(a但正确的参数是:Msg@Trajan你能粘贴涉及ChangeInput
的类型定义吗?正如@wintvelt所写的那样,你的Msg定义是否包含ChangeInput Id字符串
?这就是问题所在,定义:)