I think I came up with a workable solution by adding a tiny bit of 
abstraction.

import Html exposing (Attribute, Html, a)
import Html.Events exposing (onWithOptions, defaultOptions)
import Model exposing (Msg(..))
import Json.Decode as Json


link : String -> List (Attribute Msg) -> List (Html Msg) -> Html Msg
link route attributes children =
    let
        clickHandler =
            onWithOptions "click" defaultOptions <| Json.succeed <| 
NavigateTo route

        attrs =
            clickHandler :: attributes
    in
        a
            attrs
            children

What this allows me to do is replace these:

a [ onClick (NavMsg1 param1), class "some class", title "Do something" ] [ 
text "Do something" ]
a [ onClick (NavMsg2), title "Do something else" ] [ text "Dom something 
else" ]
a [ onClick (NavMsg3 param2 param3), class "is-disabled", title "Delete 
thing" ] [ text "Delete thing" ]

..which has a lot of custom Msgs (one Msg per route).. and replace it with

link ("/something?param1=" ++ param1) [ class "some class", title "Do 
something" ] [ text "Do something" ]
link ("/home") [ title "Do something else" ] [ text "Dom something else" ]
link ("/deletePage?param2=" ++ param2 ++ "&param3=" ++ param3) [ class 
"is-disabled", title "Delete thing" ] [ text "Delete thing" ]

The above reads very similar to using an anchor tag with an href attribute 
which is what I was hoping for.

Additionally, just as with your solution, there is only one Msg for going 
to the different pages rather than a unique Msg for every different page.

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to