2016-05-21 7 views
12

Ich habe festgestellt, dass in der Führung:Was bedeutet eine Funktion mit 2 Werten auf der rechten Seite? (Modell -> Html msg)

viewValidation : Model -> Html msg 
viewValidation model = 
    let 
    (color, message) = 
     if model.password == model.passwordAgain then 
     ("green", "OK") 
     else 
     ("red", "Passwords do not match!") 
    in 
    div [ style [("color", color)] ] [ text message ] 

Also das ist eine Funktion, die die Model nimmt. Html msg sieht für mich normalerweise so aus, als würden wir die Funktion Html mit dem Argument msg aufrufen.

msg scheint jedoch keine Rolle in einem anderen Teil der viewValidation Funktion zu spielen. Was bedeutet es und wofür ist es in diesem Fall?

Antwort

13

Html Msg ist nur ein Typparameter, wie List Int ist. Während List Int eine Liste angibt, die Element vom Typ Int enthält, beschreibt ähnlich Html Msg einige HTML, die Nachrichten des Typs Msg behandeln/ausgeben können.

Zum Beispiel, wenn Sie auf eine Schaltfläche in Ihrem HTML haben, es könnte wie folgt aussehen:

button [ onClick DoSomething ] [ text "caption" ] 

Wo DoSomething ein Fall des Msg Typ ist.

+1

Obwohl, wenn ich mich nicht irre, 'viewValidation' keine' msg' auslöst, richtig? – MoeSattler

+1

ja, du hast Recht. Da "List" mit einem Parameter definiert werden muss (Sie könnten 'List a' verwenden), selbst wenn es leer ist, muss' Html' mit einem Parameter definiert werden, auch wenn dieser Parameter nicht verwendet wird. Wenn Sie möchten, können Sie 'Html a' verwenden. – marcosh

+0

Auch wenn es nichts zurückgibt, können Sie Html() verwenden. Siehe: http: // Stackoverflow.com/questions/37257407/elm-how-to-create-a-view-that-nicht-return-msg-in-0-17 – afcastano

8

Mischen Sie die Typdefinition nicht mit der normalen Ausführung von Code. Html ist keine Funktion, es ist ein Typ, der einen Parameter verwendet, um einen Typ für eine Ansichtsfunktion zu definieren.

Html msg ist die allgemeinste Definition, die Sie als msg haben können, ist eine Variable selbst, also gibt das Html zurück, das unabhängig von dem msg-Typ ist, den Sie gerade verwenden. Dies kann entweder daran liegen, dass keine Ereignisnachrichten erstellt werden, oder weil die Ansichtsfunktion Nachrichten als Parameter akzeptiert.

Wie die Kommentare festgelegt Html() wäre ein sehr enger Typ, der gezwungen ist, nichts zurückzugeben.

Der häufigste Fall ist jedoch eine View-Funktion, die Html Msg zurückgibt - d.h. HTML mit Nachrichten, die auf Benutzerinteraktionen basieren.

Da Elm Komponentenisierung fördert, müssen Sie auch Html.map beachten. Es ist Typ Unterschrift Html.map : (a -> b) -> Html a -> Html b. Im Rahmen der Komponenten ist dies leichter zu lesen als

Html.map : (Child.Msg -> Parent.Msg) -> Html Child.Msg -> Html Parent.Msg 

Beachten Sie, dass, wenn Sie Ihre Nachrichten in Ihrem Stammkomponente definieren, haben Sie so etwas wie:

type Msg = ChildMsg Child.Msg 

was bedeutet, dass ChildMsg Typ hat Unterschrift :

ChildMsg : Child.Msg -> Parent.Msg 

So haben meine Ansicht Funktionen viel

parentView model = 
    -- childView model.child |> Html.map ChildMsg 
    Html.map ChildMsg (childView model.child)