Вяз навигационные прыжки после навигации - PullRequest
0 голосов
/ 29 августа 2018

У меня проблема с навигацией в браузере с использованием elm. Ошибка возникает, когда я перехожу на определенную страницу / thing / sufflist , которая отображается, а затем меня переводят на путь / home . С помощью кнопки «Назад» моего браузера я могу без проблем зайти на страницу / thing / stufflist .

/ thing является главной страницей, касающейся вещи, и тогда она имеет эквиваленты вкладок в / thing / xxx

У меня настроена следующая маршрутизация с помощью elm navigation:

        case routePath of
            DefaultRoute ->
                notFoundPage model

            HomeRoute ->
                homePage model

            ...

            ThingTab id page ->
                case String.toInt id of
                    Ok thingId ->
                        ThingMain.page thingId model page

                    Err error ->
                        ThingMain.page 0 model page

            NotFoundRoute ->
                notFoundPage model

ThingMain.page -

page : Int -> Model -> String -> Html Msg
page thingId model page =

    let
        maybeThing =
            model.thingList
                |> List.filter (\thing -> thing.id == thingId)
                |> List.head
    in
        case maybeThing of
            Just thing ->
                    case page of
                        "info" ->
                            thingView thing (thingInfoView thing)

                        "stuffs" ->
                            let
                                stuffs =
                                    model.stuffList
                                    |> List.filter (\stuff -> stuff.ting.id == thingId)
                            in
                                thingView thing (stuffsView stuffs)

                        _ -> 
                            Error.notFoundPage model

            Nothing ->
                Error.notFoundPage model 

Это SubsView:

stuffsView : List Stuff.Stuff -> Html Msg
stuffsView stuffs =
    div [class "dialog-large"][
        div [class "list"][
            renderStuffList stuffs
        ]
    ]

Используйте этот метод для отображения списка:

renderStuffList : List Stuff.Stuff -> Html Msg
renderStuffList stuffs =
    if List.isEmpty stuffs then
        text "No stuff"
    else 
        stuffs 
            |> List.map ( \stuff -> listStuff stuff )
            |> ol [ class "stuff-list" ]

И подается в этот общий метод страницы:

thingView : Thing.Thing -> Html Msg -> Html Msg
thingView thing tabContent =
     div [class "mr-main flex-column flex-start"][
        h4 [][ text (thing.name) ]
        , tabContent        
        ,div [class "dialog-large split-choice"][
            button [class "input", onClick (Msg.Navigate("thing/" ++ toString thing.id )) ][
            text ("Info")
            ]
            ,button [class "input", onClick (Msg.PostAndNavigate (stuffListRequest thing.id)) ][
            text ("Stuffs")
            ]
        ]
        ,div [class "dialog-large split-choice"][
            button [class "input half-width", onClick ( Msg.Navigate("home") ) ][ 
                text ("Home") 
            ]
        ]
    ]

Все работает нормально во всех случаях, кроме случаев, когда на вкладке списков материалов есть пустой список. И, как уже говорилось, я могу даже вернуться назад и просмотреть мою страницу «Нет материала».

Мне все это кажется (черной) магией, и я понятия не имею, где искать?

1 Ответ

0 голосов
/ 29 августа 2018

В этом коде нет ничего плохого. Как я и подозревал, это моя вина.

В моей логике есть человеческая ошибка, когда я выполняю запрос get (ish) для синхронизации данных при переходе к / thing / stufflist . Оказывается, я не получил список, если в нем ничего не было.

...