【发布时间】:2018-05-30 11:43:55
【问题描述】:
我已经成功实现了elm tutorial 的删除播放器方法。
但是,如果不手动发送 ForchFetch 消息(通过单击按钮)再次从服务器获取玩家,我无法更新模型。这是我的代码:
我的删除按钮:
deleteBtn : Player -> Html.Html Msg
deleteBtn player =
let
message =
Msgs.Delete player
in
a
[ class "btn regular", onClick message]
[ i [ class "fa fa-pencil mr1" ] [], text "Delete" ]
我的删除消息:
type Msg =
| Delete Player
| OnDeletePlayer (Result Http.Error Player)
| ForceFetch
| OnFetchPlayers (WebData (List Player))
我的更新功能:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
Msgs.ForceFetch ->
(model, fetchPlayers)
Msgs.OnFetchPlayers response ->
( { model | players = response }, Cmd.none )
Msgs.Delete player ->
(model, deletePlayerCmd player)
Msgs.OnDeletePlayer (Ok player) ->
(updateDeletedPlayerList model player, Cmd.none)
Msgs.OnDeletePlayer (Err player) ->
(model, Cmd.none)
updateDeletedPlayerList : Model -> Player -> Model
updateDeletedPlayerList model deletedPlayer =
let
updatedPlayers = RemoteData.map (List.filter (\p -> deletedPlayer /= p)) model.players
in
{ model | players = updatedPlayers}
deletePlayerCmd : Player -> Cmd Msg
deletePlayerCmd player =
Http.send Msgs.OnDeletePlayer (deletePlayerRequest player)
deletePlayerRequest : Player -> Http.Request Player
deletePlayerRequest player =
Http.request
{ body = Http.emptyBody
, expect = Http.expectJson playerDecoder
, headers = []
, method = "DELETE"
, timeout = Nothing
, url = savePlayerUrl player.id
, withCredentials = False
}
fetchPlayers : Cmd Msg
fetchPlayers =
Http.get fetchPlayersUrl playersDecoder
|> RemoteData.sendRequest
|> Cmd.map Msgs.OnFetchPlayers
为了更好地衡量我的模型:
type alias Model =
{ players : WebData (List Player)
, route : Route
, newPlayerName : String
, newPlayerId : String
, newPlayerLevel : Int
}
编辑:
我尝试以以下方式合并fetchPlayers,但没有成功:
Msgs.OnDeletePlayer (Ok player) ->
(updateDeletedPlayerList model player, fetchPlayers)
【问题讨论】:
-
如果
ForceFetch有效,我不明白为什么您的编辑尝试无效。您确定回复最终是Ok而不是Err? -
我解决了,我会尽快更新答案。
-
如果您在过滤器中比较玩家记录,它们可能不匹配,因为您从服务器获得的记录可能不同。最好只对 player.id 进行比较。
标签: functional-programming single-page-application elm