2017-01-08 27 views
3

У меня есть простой виджет, который должен установить «текст» кнопки из заданного текстового поля ввода.ReflexFRP: Как установить текст кнопки из textInput при нажатии кнопки

Пока мне удалось сделать простой четкие функциональные возможности

buttonWidget :: MonadWidget t m => m() 
buttonWidget = do 
    send <- button "clear" 
    input <- textInput $ def & setValue .~ fmap (const "") send 
    return() 

мне не удалось установить метку кнопки - код ниже компилирует

buttonWidget :: MonadWidget t m => m() 
buttonWidget = do 
    rec send <- button val 
     input <- textInput $ def & setValue .~ fmap (const "") send 
     val <- sample $ current $ view textInput_value input 
    return() 

но глядя на выходе index.html - я получаю только белая страница с сообщением об ошибке консоли:

rts.js:7313 thread blocked indefinitely in an MVar operation

ответ

3

Что здесь происходит, что button принимает String (или текст, в зависимости от версии), и эта строка зависит от значения текста вход, который, в свою очередь, зависит от события, создаваемого кнопкой. Теперь обычные аналогичные петли в сети событий просто прекрасны, но здесь вам нужно пробовать входное значение для получения текста до, кнопка даже отображается (потому что для этого нужен текст для рендеринга в DOM).

Следующий код (написанный в hsnippet, так что старый рефлекс-dom и упрощенный (без объектива), показывает, как можно определить помощника «кнопки», который не должен иметь реализованный текст перед записью в DOM:

app :: MonadWidget t m => App t m() 
app = do 
    rec send <- button' $ _textInput_value input 
     input <- textInput $ def { _textInputConfig_setValue = fmap (const "") send } 
    return() 

button' :: MonadWidget t m => Dynamic t String -> m (Event t()) 
button' s = do 
    (e, _) <- elAttr' "button" (M.singleton "type" "button") $ dynText s 
    return $ domEvent Click e 
3

Кажется, что кнопки ванили в reflex-dom не поддерживают динамическую маркировку; поэтому для

solutionWidget :: MonadWidget t m => m() 
solutionWidget = do 
    rec send <- dynButton dyn 
     input <- textInput $ def & setValue .~ fmap (const "") send 
     dyn <- holdDyn "click button to set text below" 
        (tag (current $ view textInput_value input) send) 
    return() 

необходимо определить следующее:

dynButton :: MonadWidget t m => Dynamic t Text -> m (Event t()) 
dynButton s = do 
    (e, _) <- elAttr' "button" (Map.singleton "type" "button") $ dynText s 
    return $ domEvent Click e 
+0

о, вы нашли его раньше, чем я отправил свой ответ Опубликовано в любом случае, с кратким объяснением того, что происходит на – Bartosz

+0

Помимо внимание:.. «кнопка» немного странно с точки API зрения. Похоже, что это просто используется, чтобы быстро добавить несколько кнопок, но быстро становится бесполезным, как только вы захотите больше от него. – Bartosz

 Смежные вопросы

  • Нет связанных вопросов^_^