Если вы хотите выдавать навигационные сообщения верхнего уровня из view
подстраницы, нет ничего плохого в том, чтобы конкретно возвращать тип сообщения верхнего уровня, например:
view : Login.Model -> Html Types.Msg
Если вы настаиваете на том, чтобы абстрагировать тип сообщения, как указано, вы можете передать дополнительный аргумент для навигационных сообщений:
view : (Types.Page -> msg) -> (Login.Msg -> msg) -> Login.Model -> Html msg
view navigateTo wrapPageMsg model = ...
и функции представления верхнего уровня передают NavigationStart
в качестве первого аргумента.
Наконец, если вам нужно, чтобы update
подстраницы был в состоянии вызвать навигацию верхнего уровня, вы можете поместить эту информацию в возвращаемое значение:
-- Login.update, updates the model and
-- optionally returns a navigation destination
update : Login.Msg -> Login.Model -> (Login.Model, Maybe Types.Page)
-- top level update
update : Msg -> Model -> Model
update msg model =
let
-- navigation helper
navigateTo page model = ...
in
case (msg, model) of
(NavigationStart p, _) ->
navigateTo p model
(LoginMsg lmsg, LoginModel lmodel) ->
let
(newlmodel, navigate) = Login.update lmsg lmodel
in
case navigate of
Just p ->
navigateTo p model
Nothing ->
LoginModel newlmodel
...
В целом: можно адаптировать типы представлений и функций обновления для своих подстраниц в соответствии с вашими конкретными требованиями!