2016-08-21 2 views
3

У меня есть URL-адрес /user/3, где я делаю http-запрос, чтобы получить информацию о пользователе.ELM-LANG, как сделать http-запрос при нажатии на кнопку назад браузера

Если я перехожу на /user/6, я сделаю еще один http-запрос, чтобы получить данные этого пользователя.

Моя проблема в том, что когда я нажимаю на кнопку браузера, URL-адрес возвращается к /user/3, но он по-прежнему пользователь 6 информация, отображаемая.

Как это сделать? Можно ли вернуть мою старую модель? Или мне нужно снова сделать http-запрос, чтобы получить пользователь 3.

Мой urlUpdate выглядит следующим образом:

urlUpdate : Result String Route -> Model -> (Model, Cmd Msg) 
urlUpdate result model = 
    let 
    currentRoute = 
     Routing.routeFromResult result 

    in 
     ({ model | route = currentRoute }, Cmd.none) 

Я немного потерял, я не знаю, где это сделать.

Если не ясно, я хотел бы «поймать» событие, когда пользователь нажимает кнопку «Назад» браузера, чтобы получить старый URL-адрес, а затем сделать http-запрос, чтобы снова получить эту информацию пользователя.

Я пользуюсь пакетом elm-navigation.

Я пытаюсь сделать это в моем urlUpdate:

urlUpdate : Result String Route -> Model -> (Model, Cmd Msg) 
urlUpdate result model = 
    let 
    currentRoute = 
     Routing.routeFromResult result 

    command = 
     case currentRoute of 
     Routing.HomeRoute -> 
      getUsers 
     Routing.userRoute id -> 
      getUser id 
     Routing.NotFoundRoute -> 
      Cmd.none 

    in 
     ({ model | route = currentRoute }, command) 

что то же самое, что моя функция инициализации. Это не работает, потому что он делает бесконечный цикл исполнением urlUpdate

+0

Какой пакет маршрутизации вы используете? –

+0

я использую вязание навигация. Я обновляю свой вопрос – BoumTAC

ответ

3

Предполагая, что вы используете модуль elm-lang/navigation. urlUpdate вызывается при изменении URL-адреса (в том числе нажатие кнопки навигации браузера).

Таким образом, один способ справиться с изменением URL-адрес может быть вернуть Http команду доступа вместо Cmd.none во втором возвращаемого значения вашей urlUpdate функции. Когда Task решает или не удается, Msg (в этом примере FetchFail или FetchScucceed) будет выброшен, так что , что вы можете отреагировать на update вашей модели.

В приведенном ниже примере я обновил модель, чтобы вы могли показать spinner до тех пор, пока вызов API не будет разрешен.

образец:

urlUpdate : Result String Route -> Model -> (Model, Cmd Msg) 
urlUpdate result model = 
    case result of 
    Ok url -> 
     let 
     userId = getUserId url 
     in 
     ({ model | spinner = True }, getUserInfo userId) 
    Err _ -> 
     ({ model | showErr = True }, Cmd.none) 

-- API call 
getUserInfo : String -> Cmd Msg 
getUserInfo str = 
    let 
    decodeUserInfo = Json.at ["args", "userid"] Json.string 
    url = "https://httpbin.org/get?userid=" ++ str 
    in 
    Task.perform FetchFail FetchSucceed (Http.get decodeUserInfo url) 
+0

Я пытаюсь что-то вроде этого (я обновляю свой вопрос на примере), но это не сработало, потому что это был бесконечный цикл, всегда был выполнен urlUpdate – BoumTAC

+0

Бесконечный цикл ... Вы возвращаете один из 'Cmd' из' update' функции? Навигационный пакет предоставляет некоторую модификацию url 'Cmd'. – Tosh

+0

Да, я использую 'getUser ID' в команде в моем обновлении. Это выполняется, когда я нажимаю кнопку после ввода своего идентификатора на входе. – BoumTAC

Смежные вопросы