SPA动态路由和页面渲染

时间:2015-08-12 06:20:11

标签: elm

我是Elm的新手,可能对架构有不正确的理解,这可能是一个XY问题(但我还不知道......)

无论如何,我正在尝试在Elm中创建一个url-routed SPA。我使用evancz/start-app生成单个动态页面,使用elm-achitecture-tutorial example 1作为每个“页面”的起点:

Frontend.Pages.Home.display : Signal Html
Frontend.Pages.Home.display = StartApp.start
    { model = 0
    , update = update
    , view = view
    }

type alias Model = Int

type Action = Increment | Decrement

update : Action -> Model -> Model
update action model =
  case action of
    Increment -> model + 1
    Decrement -> model - 1

view : Signal.Address Action -> Model -> Html
view address model =
  div []
    [ button [ onClick address Decrement ] [ text "-" ]
    , div [ countStyle ] [ text (toString model) ]
    , button [ onClick address Increment ] [ text "+" ]
    ]

我正在使用TheSeamau5/elm-router

route : String -> Signal Html
route = Router.match
    [ "/" :-> Frontend.Pages.Home.display
    ] Frontend.Pages.Errors.FourOhFour.display

我正在使用TheSeamau5/elm-history收集最新的网址:

main : Signal Html.Html
main = Frontend.Routes.route History.path

显然这是错误;我将Signal String传递给一个带String的方法。问题是,如果我使用以下内容:

main = Signal.map Frontend.Routes.route History.path

我希望Signal.map Frontend.Routes.route History.path属于Signal Html类型,而编译器会抱怨冲突:

The type annotation for `main` does not match its definition. 

7| main : Signal Html.Html
          ^^^^^^^^^^^^^^^^ As I infer the type of values flowing through your program, I see a conflict between these two types:

Html.Html

Signal Html.Html
  • 这里发生了什么?似乎Signal.Map正在“解包”Signal Html。是这种情况吗?

无论如何,我的核心问题似乎是:如何呈现单页应用,根据Signal String路由到单独的被动“网页”,而不重新实现{{1 }}吗

提前致谢。

1 个答案:

答案 0 :(得分:1)

我相信你的最终结果是Signal (Signal Html),而主要期待Signal Html。我相信您收到的错误是专门针对Signal a期望的类型。它说,我期待aHtml,但实际上我发现它是Signal Html

以下是我们的类型:

Signal.map : (a -> result) -> Signal a -> Signal result
Frontend.Routes.route : String -> Signal Html
Historypath : Signal String

然后我们Signal.map Frontend.Routes.route的类型为Signal String -> Signal (Signal Html)

然后我们应用History.path向我们提供最终结果Signal (Signal Html)

如果您将route更改为Html而不是Signal Html,那么您应该好好去。