如何在Elm 0.13中使用Fields

时间:2014-12-21 16:57:16

标签: user-interface input textbox elm

我一直在努力让这些领域发挥作用,但一直都在失败。我也一直试图寻找例子,但我能找到的唯一例子是使用Elm 0.14,它使用了Elm 0.13中没有的新的Channel API。

所以我从catalog

中提供的示例开始
import Graphics.Input.Field (..)
import Graphics.Input (..)

name : Input Content
name = input noContent

nameField : Signal Element
nameField = field defaultStyle name.handle identity "Name" <~ name.signal

为了使用我试过的字段

main : Signal Element
main = Signal.lift2 display Window.dimensions gameState

display : (Int,Int) -> GameState -> Element
display (w,h) g =
    container w h middle <|
        collage gameWidth gameHeight
            (if  | g.state == Menu ->
                    [ rect gameWidth gameHeight
                        |> filled black
                    , toForm nameField
                    , plainText "*The name entered in the nameField*"
                    ]
                | otherwise -> []
            )

但我一直收到以下错误

Expected Type: Signal.Signal Graphics.Element.Element
Actual Type: Graphics.Element.Element

为什么元素不再是信号......函数定义明确指出它应该输出一个信号,对吗?现在我如何能够输入一个名称,然后我可以在变量中使用它?

1 个答案:

答案 0 :(得分:1)

Elm 0.13有一些烦人的混淆型错误信息。预期/实际通常是交换的。在这种情况下,问题来自于使用nameField : Signal Element中的display : (Int,Int) -> GameState -> Elementdisplay是一个纯粹的(非信号)函数,但要纯粹,你不能在那里的任何地方使用信号。要解决此问题,请将nameField信号向上提升到main。要使用在字段中输入的内容,请使用输入信号:

main : Signal Element
main = Signal.lift4 display Window.dimensions gameState name.signal

nameField : Content -> Element
nameField = field defaultStyle name.handle identity "Name"

display : (Int,Int) -> GameState -> Content -> Element
display (w,h) g currentContent =
    container w h middle <|
        collage gameWidth gameHeight
            (if  | g.state == Menu ->
                    [ rect gameWidth gameHeight
                        |> filled black
                    , toForm (nameField currentContent) -- use something other than `currentContent` here to influence the field content. 
                    , plainText currentContent.string
                    ]
                | otherwise -> []
            )