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

时间:2016-08-21 21:43:49

标签: http navigation history back-button elm

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

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

我的问题是当我点击浏览器后退按钮时,网址会移回/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 )

我有点失落,我不知道该怎么做。

如果不清楚我想在用户点击浏览器后退按钮获取旧网址时“抓住”某个事件,然后发出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

1 个答案:

答案 0 :(得分:3)

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

因此,处理网址更改的一种方法是返回  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)