更新n个UI值的列表

时间:2017-06-02 11:32:23

标签: haskell threepenny-gui

我正在寻找一种方法来根据任何输入中的valueChange更新任意数量的UI.input。

这是一个只有两个输入的玩具示例:

import qualified Graphics.UI.Threepenny as UI
import Graphics.UI.Threepenny.Core
import Graphics.UI.Threepenny.JQuery

main :: IO ()
main = do 
     startGUI defaultConfig setup
     return ()

setup ::  Window -> UI ()
setup w = do 
            textboxes <- do
              tb1 <- UI.input 
              tb2 <- UI.input
              update1 <- stepper "red" $ UI.valueChange tb1
              update2 <- stepper "green" $ UI.valueChange tb2
              element tb1 # sink value (fmap reverse update2)
              element tb2 # sink value (fmap reverse update1)
              return $ column [return tb1, return tb2]

            getBody w #+ [textboxes]
            return ()

将其中一个文本框中写入的内容复制(反转)到另一个文本框中。

现在,如果我想要一个任意长度的输入UI列表,并且写入任何输入的任何内容被复制到所有其他输入中,该怎么办?我可以很容易地创建一个UI列表,但我如何阅读它们,将一个函数应用到它们的输入(如反向),然后将更改汇入所有其他的?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我对你提到的几乎所有内容都不熟悉,但你能否利用monadic结构和一些标准函数来做这样的事情:

textboxes <- do
  tbs <- replicateM 3 UI.input
  forM_ tbs $ \tbX -> do
    update <- stepper "_" $ UI.valueChange tbX
    forM_ tbs $ \tbY -> do
      element tbY # sink value (fmap reverse update)
  return $ column (map return tbs)

stepper参数是静态的,我认为在更新时你需要一种方法来跳过触发控件,但是从两个控件到控件列表的概括,我认为这可能是正确的方向?