2014-12-21 11 views
1

我一直试图让字段工作,但保持失败。我也一直在寻找例子,但我能找到的唯一例子是使用Elm 0.14,它使用Elm 0.13中没有的新的Channel API。如何使用Elm中的字段0.13

所以我从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

Elm 0.13有一些烦人的混淆类型的错误消息。预期/实际通常交换。在这种情况下,问题来自于使用nameField : Signal Elementdisplay : (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 -> [] 
      ) 
+0

那么,如果我想将此行为扩展到游戏菜单,该怎么办?我从你的回复中了解到,我应该发送所有信号,不管它们是否与当时相关,或者不是作为“显示”的额外输入。当菜单不可见时,它们将被忽略,并在菜单弹出时变得相关。这很有意义。现在我唯一关心的是,我将如何能够将信息发回田野?我将如何能够发送当前值? –

+0

我不完全确定你的意思。你想影响显示在字段中的信息吗?我将编辑代码,以便在可以影响该领域的地方更加清晰可见。例如, – Apanatshka

+0

。我有一个有名字的球员。所以'name'应该是'Player'类型的字段。当菜单打开时,它会将球员的名字从场地中读出并填入场地中。现在,用户可以在该字段中更改名称,如果它想要以不同的名称播放并且该字段将更新为新名称。 –