2017-06-17 4 views
1

J'ai ce code et cela fonctionne parfaitement. Il bascule certains styles dans le champ de saisie de texte en fonction de la valeur du champ.Elément parent dynamique

numberInput :: (MonadWidget t m) => m (Dynamic t (Maybe Double)) 
numberInput = divClass "form-group" $ do 
    let errorState = "style" =: "border-color: red" 
     validState = "style" =: "border-color: green" 
    rec n <- textInput $ def & textInputConfig_inputType .~ "number" 
          & textInputConfig_initialValue .~ "0" 
          & textInputConfig_attributes .~ attrs 
     let result = fmap (readMay . unpack) $ _textInput_value n 
      attrs = fmap (maybe errorState (const validState)) result 
    return result 

J'ai rencontré des problèmes de dynamisation de l'élément parent. Je voudrais basculer les styles sur l'élément parent de la saisie de texte. Je voudrais écrire quelque chose comme mais échoué!

numberInput :: (MonadWidget t m) => m (Dynamic t (Maybe Double)) 
numberInput = do 
    rec 
     dynAttrs <- -- reference to textInput 
     elDynAttr "div" dynAttrs $ do 
     n <- textInput $ def & textInputConfig_inputType .~ "number" 
         & textInputConfig_initialValue .~ "0" 
     ... 

Merci de votre aide!

+0

Que signifie 'échoué'? Une erreur de compilation (l'inclure * verbatim * et dans * c'est l'intégralité) ou une erreur d'exécution (la décrire)? [Vous n'avez pas envoyé de programme complet] (https://stackoverflow.com/help/mcve). Il est donc presque impossible de dire pourquoi votre programme ne fonctionne pas. – user2407038

+0

Donc 'failed' signifie que je voudrais réécrire le code de travail de la fonction numberInput de manière à ce que les attributs dynamiques soient définis sur le noeud DOM parent, mais je n'ai qu'une vague idée de comment cela pourrait fonctionner. Je n'ai pas assez compris comment réfléchir fonctionne donc je suis un peu perdu sur la façon de procéder et je ne peux pas fournir un exemple de code ou un message d'erreur. Mais j'ai une question très concrète. Comment réécrire le code parfaitement bon que je fournis d'une manière que les attributs dynamiques sont définis sur le nœud DOM parent. – Schoon

+1

"Comment réécrire ce code pour faire X au lieu de Y" est hors-sujet pour SO. Je suppose que vous voulez faire référence à 'n' dans le rhs de' dynAttrs', mais 'n' est lié dans la portée interne de l'argument passé' elDynAttr'. La solution est probablement de retourner 'n' (et toutes autres choses dont vous pourriez avoir besoin) de cette portée interne, et de lier de nouveau ces variables dans la portée externe:' do {dynAttrs <- .. n ..; (résultat, n) <- elDynAttr "div" dynAttrs $ do {n <- ..; ..; return (résultat, n)}; renvoie le résultat} '. (Je ne sais pas assez sur DOM pour dire à coup sûr). – user2407038

Répondre

0

Voici un petit programme où les attributs (Aligné à droite ou à gauche) de l'élément parent dépendent de l'état d'un élément enfant:

{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE RecursiveDo #-} 
import Reflex.Dom 
import qualified Data.Text as T 
import Safe 

main :: IO() 
main = mainWidget bodyElement 

bodyElement :: MonadWidget t m => m() 
bodyElement = el "div" $ do 
    el "h2" $ text "Dynamic parent element" 
    numberInput 
    return() 

numberInput :: (MonadWidget t m) => m (Dynamic t (Maybe Double)) 
numberInput = do 
    rec 
     let errorState = ("align" :: T.Text) =: "right" 
      validState = "align" =: "left" 
     let result = fmap (readMay . T.unpack) $ _textInput_value n 
      attrs = fmap (maybe errorState (const validState)) result 
     n <- elDynAttr "div" attrs $ do 
      n1 <- textInput $ def & textInputConfig_inputType .~ "number" 
           & textInputConfig_initialValue .~ "0" 

      text "Some additional control" 
      return n1 
    return result 

En tant qu'utilisateur user2407038 mentionne, nous devons retourner le élément de texte numérique d'une portée interne à l'étendue externe. Ensuite, nous pouvons utiliser do récursive pour accéder à l'élément que nous définissons plus tard dans le programme.

Dès que vous tapez une lettre dans le champ numérique, il va sauter vers la droite.

+0

indice de user2407038 déjà m'a aidé sur la bosse. Merci d'avoir écrit la solution. Je devais enrouler ma tête autour de Recursive Do ... – Schoon