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}很抱歉格式化:)(谢谢您的帮助!)