我有一个像/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
答案 0 :(得分:3)
假设您正在使用elm-lang/navigation
模块。
在网址更改时调用urlUpdate
(包括
点击浏览器导航按钮)。
因此,处理网址更改的一种方法是返回
Http访问命令而不是Cmd.none
在urlUpdate
函数的第二个返回值中。
当Task
结算或失败时,Msg
(在此示例中为FetchFail
或FetchScucceed
)将被抛出,因此
您可以通过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)