2017-06-17 6 views
1

Ich habe dieses Stück Code und es funktioniert einwandfrei. Je nach Feldwert werden einige Stile im Texteingabefeld umgeschaltet.Dynamisches Elternelement

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 

lief ich in einige Probleme das Element dynamische Eltern zu machen. Ich möchte die Stile im übergeordneten Element der Texteingabe umschalten. Ich möchte etwas schreiben wie, aber gescheitert!

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" 
     ... 

Vielen Dank für Ihre Hilfe! Hier

+0

Was bedeutet "gescheitert"? Ein Compiler-Fehler (include it * verbatim * und in * es ist die Gesamtheit) oder ein Laufzeitfehler (beschreiben Sie es)? [Sie haben kein vollständiges Programm gepostet] (https://stackoverflow.com/help/mcve), so dass es fast unmöglich ist, jemandem mitzuteilen, warum Ihr Programm nicht funktioniert. – user2407038

+0

Also 'gescheitert' bedeutet, dass ich den Arbeitscode der Funktion numberInput so schreiben möchte, dass die dynamischen Attribute auf den übergeordneten DOM-Knoten gesetzt werden, aber ich habe nur eine sehr vage Vorstellung, wie das funktionieren könnte. Ich habe nicht genug begriffen, wie reflect funktioniert, daher bin ich ein wenig verloren und weiß nicht, wie es weitergehen soll und kann keinen Beispielcode oder eine Fehlermeldung liefern. Aber ich habe eine sehr konkrete Frage. Wie würden Sie den vollkommen guten Code, den ich zur Verfügung stelle, so umschreiben, dass die dynamischen Attribute auf den übergeordneten DOM-Knoten gesetzt werden. – Schoon

+1

"Wie würden Sie diesen Code umschreiben, um X statt Y zu machen" ist für SO unpassend. Ich nehme an, Sie wollen sich auf 'n' in der rhs von' dynAttrs' beziehen, aber 'n' ist im inneren Bereich des Arguments gebunden, das an' elDynAttr' übergeben wird. Die Lösung ist wahrscheinlich, 'n' (und was immer Sie sonst noch brauchen) von diesem inneren Bereich zurückzugeben und diese Variablen wieder im äußeren Bereich zu binden:' do {dynAttrs <- .. n ..; (Ergebnis, n) <- elDynAttr "div" dynAttrs $ do {n <- ..; ..; Rückgabe (Ergebnis, n)}; Ergebnis zurückgeben} '. (Ich weiß nicht genug über DOM, um es sicher zu sagen). – user2407038

Antwort

0

ist ein kleines Programm, in dem die Attribute (rechts oder links ausrichten) des Elternelements abhängig von dem Zustand eines Kindes Element:

{-# 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 

als Benutzer user2407038 erwähnt, haben wir die Rückkehr numerisches Textelement von einem inneren Bereich zum äußeren Bereich. Dann können wir rekursives tun, um auf das Element zuzugreifen, das wir später im Programm definieren.

Sobald Sie einen Buchstaben in das numerische Feld eingeben, springt er nach rechts.

+0

user2407038's Hinweis hat mir schon über den Buckel geholfen. Danke, dass Sie die Lösung geschrieben haben. Ich musste meinen Kopf um Recursive Do wickeln ... – Schoon