在客户端/服务器编程中使用threepenny-gui / reactive

时间:2014-07-16 15:33:32

标签: haskell threepenny-gui

我试图找出如何使用Haskell threepenny-gui及其reactive功能来编写一个程序,让

  • 用户从listBox中选择一个项目
  • 将选择发送到外部服务器
  • 从服务器获取结果列表
  • 使用结果填充listBox
  • 重复

我似乎需要使用HandlernewEventregister来完成上述操作。如果有人能够指出一些现有的代码可以做出类似上面的事情那么好。

我发现的最近的是{penner-gui GameThing.hs目录中的samples(但它不会使用register)。

更新:

我在问我是否应该使用HandlernewEventregister ---如果是的话,还要对这些功能做一些澄清或示例。

另外,要清楚,大局是:

browser  --> threepenny-gui (on localhost) --> backend server (anywhere on network)
         <--                               <--

换句话说,我需要做一些IO(根据用户选择)然后显示该IO的结果。

更新:这是我的解决方案(基于@ Taldykin的回应):https://github.com/haroldcarr/rdf-triple-browser/tree/master/haskell/src

1 个答案:

答案 0 :(得分:3)

enter image description here

这是一段代码。我稍后会添加说明。

{-# LANGUAGE LambdaCase #-}
import Graphics.UI.Threepenny as UI


main :: IO ()
main = do
  (evFillList, doFillList) <- newEvent
  initialList <- valuesSupply ""
  behFillList <- stepper initialList evFillList

  startGUI defaultConfig $ \win -> do
    list <- ul
    sel <- listBox
        behFillList
        (pure Nothing)
        (pure $ \it -> UI.span # set text it)

    getBody win #+ [grid [[element list, element sel]]]
    setFocus $ getElement sel

    on selectionChange (getElement sel) $ \case
      Nothing -> return ()
      Just ix -> do
        items <- currentValue behFillList
        let it = items !! ix
        liftIO $ valuesSupply it >>= doFillList
        element list #+ [li # set html it]
        setFocus $ getElement sel


valuesSupply :: String -> IO [String]
valuesSupply x = return [x ++ show i | i <- [0..9]]