Обновить список из n значений пользовательского интерфейса
Я ищу способ обновить произвольное количество UI.inputs на основе valueChange в любом из входов.
Вот игрушечный пример с двумя входами:
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 ()
Все, что написано в одном из текстовых полей, копируется (переворачивается) в другое текстовое поле.
Теперь, что, если я хотел бы иметь список произвольной длины входных интерфейсов, и любая вещь, записанная в любой из входов, копируется во все остальные? Я могу достаточно легко создать список пользовательских интерфейсов, но как мне прочитать их все, применить функцию к их входным данным (например, обратный), а затем включить изменение во все остальные?
Какие-нибудь мысли?
1 ответ
Я не знаком со всем, что вы упомянули, но вы могли бы использовать монадическую структуру и некоторые стандартные функции, чтобы сделать что-то вроде этого:
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
Аргумент является статическим, и я думаю, что вам потребуется способ пропустить запускающий элемент управления при обновлении, но с точки зрения обобщения от двух элементов управления до списка элементов управления я думаю, что это может быть правильное направление?