如何在Elm中动态创建输入?

时间:2012-12-01 15:51:20

标签: functional-programming frp elm

我想创建一个按钮,当按下该按钮时,会向表单添加一个新输入(或textarea)。

2 个答案:

答案 0 :(得分:10)

如果要在每次单击按钮时添加文本字段,则表示您希望显示的文本字段数等于单击按钮的次数。我们可以使用按钮的countIf id信号¹上的clicked创建一个告诉我们按钮被点击频率的信号。

如果我们有输入列表,我们可以使用flow在彼此之下(或之外)显示它们。编写一个带有数字n的函数并生成一个包含按钮和n文本字段的列表是相当简单的。

所以现在我们可以使用lift将该函数挂钩到我们的信号,该信号计算按钮点击次数,将其与flow函数结合起来,并且我们有一个动态按钮创造投入。

(btn, clicked) = Input.button "Click me!"

-- Count how often the clicked signal is true
clicks = countIf id clicked

main = lift2 flow (constant down) $ lift nInputs clicks

nInputs n =
  let helper n acc =
    if n<=0 then btn : acc
    else
      -- Input.textField returns a pair containing the field as well as a signal
      -- that you can use to access the field's contents. Since I don't actually
      -- ever do anything with the contents, I just ignore the signal here.
      -- In your real code, you'd probably want to keep the signal around as well.
      let (field, _) = Input.textField $ "input " ++ (show n)
      in helper (n-1) $ field : acc
  in helper n []

¹只需使用count即可计算信号变化的频率。由于每次单击都会使信号的值更改为true,然后再返回到false,这将计算每次点击2次更改。通过使用countIf id,我们只计算信号为真的次数,从而计算点击次数。

答案 1 :(得分:2)

从Elm 0.8开始,确实可以做到这一点。请参阅the release announcement的{{3>},输入组部分和online reference