http - ELM-LANG 如何在单击浏览器后退按钮时发出 http 请求

标签 http navigation history back-button elm

我有一个类似 /user/3 的 url,我在其中发出 http 请求以获取用户信息。

如果我移动到 /user/6,我将发出另一个 http 请求来获取此用户数据。

我的问题是当我点击浏览器后退按钮时,url 移回 /user/3 但它仍然显示 user 6 信息。 p>

我该怎么做?是否有可能让我的旧模型恢复原状?还是我必须再次发出 http 请求才能获取 user 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

最佳答案

假设您正在使用 elm-lang/navigation 模块。 urlUpdate 在 url 更改时被调用(包括 点击浏览器导航按钮)。

因此,处理 url 更改的一种方法是返回 Http 访问命令而不是 Cmd.noneurlUpdate 函数的第二个返回值中。 当 Task 解决或失败时,将抛出 Msg(在本例中为 FetchFailFetchScucceed),因此 您可以通过更新您的模型来使用react。

在下面的示例中,我更新了模型以便您可以显示微调器 直到 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)

关于http - ELM-LANG 如何在单击浏览器后退按钮时发出 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39069122/

相关文章:

java - 安卓文件下载。不以文件名和类型结尾的媒体 URL,问题

jquery - OnePage 导航 - 滚动一个排除的元素时是否有事件指示器?

javascript - HTML4 和 HTML5 - 如何在不导航的情况下判断是否有可用的 `Back` 状态?

css - 向上滚动和向下滚动时导航按钮的颜色变化

android - 新抽屉导航 - 如何使用标题和计数器?

history - Foursquare - friend 的签到历史记录?

mysql - 跟踪 MySQL 数据库更改

JSON REST 服务 : Content-Encoding: gzip

php - 如何在 Postman 中查看重定向链?

c++ - C++ HTTP客户端recv()和写入文件问题