2017-05-16 5 views
2

Konkret versuche ich Elm mit einem bereits definierten Parameter zu initialisieren. Etwas wie:Wie greife ich auf das Fensterobjekt von Elm aus zu?

initialModel = 
    { me = window.user 
    , todos = window.todos 
    } 

Alles, was ich finden kann, ist, wie Fenster Dimensionen unter Verwendung von Signalen zu erhalten, aber ich bin auf Elm 0,18 und es scheint etwas veraltet.

Edit: Nur um klar zu sein, würde der obige Code nicht funktionieren. Was auch immer mit dem window Objekt verbunden war, müsste JS sein, also müsste es einen Decoder durchlaufen.

Antwort

3

Sie müssen programWithFlags verwenden, um Initialwerte von Javascript zu übergeben. Die "Flags", die Sie von javascript übergeben, sollten den gleichen Datensatztyp haben, wenn Sie die automatische Typumwandlung von Elm verwenden möchten:

Nehmen wir an, Ihre me ist nur eine Zeichenfolge, aber Ihre todos ist eine Liste der booleschen Flags und einer Bezeichnung. Ihre Flags Art könnte wie folgt aussehen:

type alias Todo = 
    { done : Bool, label : String } 

type alias Flags = 
    { me : String, todos : List Todo } 

Ihre init Funktion müßte die Fahnen Wert in geeigneter Weise zu handhaben. Hier ist ein Beispiel für nur die Felder Zuordnung Felder mit dem gleichen Namen Modell:

type alias Model = 
    { me : String, todos : List Todo } 

main : Program Flags Model Msg 
main = 
    Html.programWithFlags 
     { init = init 
     , view = view 
     , update = update 
     , subscriptions = \_ -> Sub.none 
     } 

init : Flags -> (Model, Cmd Msg) 
init flags = 
    { me = flags.me, todos = flags.todos } ! [] 

Ihr Javascript benötigt aktualisiert wird in den Flaggen zu übergeben. Sie tun das, ein JSON-Objekt als ersten Parameter, indem auf Vollbild oder einbetten:

var app = Elm.Main.fullscreen({ 
    "me": "John Doe", 
    "todos": [ 
    { done: true, label: "Do this thing" }, 
    { done: false, label: "And this thing" } 
    ] 
}); 

hier ein working example on ellie-app.com

Wenn Elm ist die automatische json-to-Mapping Umwandlung ist nicht stark genug für Ihre Dekodierung, Sie können stattdessen den Typ Json.Decode.Value als Ihr Flag verwenden, dann Json.Decode.decodeValue mit Ihrem Kunden-Decoder. Here is an example on ellie-app.com of using a custom decoder.

+0

Das ist brilliant. Ich danke dir sehr. –

Verwandte Themen