【问题标题】:ELM-LANG how to make http request when clicking on browser back buttonELM-LANG单击浏览器后退按钮时如何发出http请求
【发布时间】:2016-08-21 21:43:48
【问题描述】:

我有一个像 /user/3 这样的网址,我在其中发出 http 请求以获取用户信息。

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

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

我该怎么做?是否有可能让我的旧模型回来?还是我必须再次发出 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 )

我有点迷茫,我不知道在哪里做这个。

如果不清楚,我想在用户单击浏览器后退按钮以获取旧网址然后发出 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 )

这和我的 init 函数是一样的。它不起作用,因为它使无限循环执行urlUpdate

【问题讨论】:

  • 你用的是哪个路由包?
  • 我使用榆树导航。我已经更新了我的问题

标签: http navigation history back-button elm


【解决方案1】:

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

因此,处理 url 更改的一种方法是返回 Http访问命令代替Cmd.noneurlUpdate 函数的第二个返回值中。 当Task解析或失败时,Msg(在本例中为FetchFailFetchScucceed)将被抛出,所以 你可以通过update你的模型来做出反应。

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

【讨论】:

  • 我尝试了这样的事情(我用示例更新了我的问题),但它不起作用,因为它是一个无限循环,总是执行 urlUpdate
  • 无限循环...您是否从update 函数返回Cmd 之一?导航包提供了一些url修改Cmd.
  • 是的,我在更新的命令中使用了getUser ID。这是在我在输入中输入他的 ID 后单击按钮时执行的
  • 如果我是你,我会将Debug.log 放在我发出 url 更改 cmds 的所有地方,并查看哪个执行路径导致了循环。如果它是由外部代码(Jquery 插件等)引起的,则可能很难捕捉到。
猜你喜欢
  • 1970-01-01
  • 2013-04-20
  • 2014-10-30
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多