我一直在努力让这些领域发挥作用,但一直都在失败。我也一直试图寻找例子,但我能找到的唯一例子是使用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
为什么元素不再是信号......函数定义明确指出它应该输出一个信号,对吗?现在我如何能够输入一个名称,然后我可以在变量中使用它?
答案 0 :(得分:1)
Elm 0.13有一些烦人的混淆型错误信息。预期/实际通常是交换的。在这种情况下,问题来自于使用nameField : Signal Element
中的display : (Int,Int) -> GameState -> Element
。 display
是一个纯粹的(非信号)函数,但要纯粹,你不能在那里的任何地方使用信号。要解决此问题,请将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 -> []
)