Elm SPA动态路由和页面呈现

Elm SPA动态路由和页面呈现,elm,Elm,我是新来的Elm,可能对架构有不正确的理解,这可能是一个XY问题(但我还不知道…) 无论如何,我正在尝试在Elm中创建一个url路由SPA。我正在使用evancz/start app生成单个动态页面,使用作为每个“页面”的起点: Frontend.Pages.Home.display : Signal Html Frontend.Pages.Home.display = StartApp.start { model = 0 , update = update , view

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

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

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 "+" ]
    ]
我正在使用SAMAU5/elm路由器来

route : String -> Signal Html
route = Router.match
    [ "/" :-> Frontend.Pages.Home.display
    ] Frontend.Pages.Errors.FourOhFour.display
我正在使用SEMAU5/elm历史记录收集最新的url:

main : Signal Html.Html
main = Frontend.Routes.route History.path
显然,这就是错误所在;我正在将一个
信号字符串
传递给一个接受
字符串
的方法。问题是,如果我使用以下方法:

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(Signal Html)
的最终结果,main期待
Signal Html
。我相信您收到的错误是针对它预期的
信号a
类型的。它是说,我本来希望
a
Html
,但事实上我发现它是
signalhtml

以下是我们的类型:

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
,您应该可以走了。

很抱歉,我无法尝试您目前所说的内容,但我明白,我会将route的签名更改为
route:String->Html
?这不就是将类型错误转发给Route函数吗?
Frontend.Pages.Home.display:Signal Html
无法更改,因为我正在尝试扩展框架教程(看起来像这样:),除非将其设置为SPA。这不包括移除MVU的StartApp部分吗?除了更改URL之外,这不会破坏模型视图级别的交互性吗?你是对的。您的
display
函数只需返回
Html
。如果我理解正确,
display
是用
StartApp.start
实现的,它生成一个
Signal.Html
,然后返回。这是否正确?您是否愿意分享您的
display
实现?我想更好地了解我们如何延迟使用
StartApp.start
包装它。是的,它实际上是中的函数重命名
main
,相关的实现是来自。。。因此它是:Frontend.Pages.Home.display=StartApp.start{model=0,update=update,view=view}很抱歉格式化:)(谢谢您的帮助!)