本頁包含 Elm 0.18
玩家更新(Update)
最後,需要在 update
函式中解釋新的訊息。位於 src/Players/Update.elm 檔案:
新增 import:
import Players.Models exposing (Player, PlayerId)
import Players.Commands exposing (save)
新增更新命令
新增 helper 函式,用來給儲存玩家 API 產生命令。
changeLevelCommands : PlayerId -> Int -> List Player -> List (Cmd Msg)
changeLevelCommands playerId howMuch players =
let
cmdForPlayer existingPlayer =
if existingPlayer.id == playerId then
save { existingPlayer | level = existingPlayer.level + howMuch }
else
Cmd.none
in
List.map cmdForPlayer players
當收到 ChangeLevel
訊息時,此函式會被呼叫:
- 收到玩家 id 及不同的等級
- 收到既有玩家的列表
- 針對列表中每一個玩家,比對其 id 是否與我們要修改的玩家 id 相符
- 如果有符合,傳回命令修改該玩家等級
- 最後傳回欲執行的命令列表
更新玩家
新增另一個 helper 函式,當收到 server 回應時更新玩家:
updatePlayer : Player -> List Player -> List Player
updatePlayer updatedPlayer players =
let
select existingPlayer =
if existingPlayer.id == updatedPlayer.id then
updatedPlayer
else
existingPlayer
in
List.map select players
當我們從 API 收到 SaveSuccess
訊息時將會呼叫此函式:
- 取得更新後玩家及既有玩家的列表
- 針對列表中每一個玩家,比對其 id 是否與更新後玩家相同
- 如果有符合,傳回更新後玩家,否則傳回既有玩家
增加分支到 update
新增分支到 update
函式:
update message players =
case message of
...
ChangeLevel id howMuch ->
( players, changeLevelCommands id howMuch players |> Cmd.batch )
OnSave (Ok updatedPlayer) ->
( updatePlayer updatedPlayer players, Cmd.none )
OnSave (Err error) ->
( players, Cmd.none )
- 在
ChangeLevel
呼叫 helper 函式changeLevelCommands
。函式傳回欲執行的命令列表,可以使用Cmd.batch
批次執行命令。 - 在
OnSave (Ok updatedPlayer)
呼叫 helper 函式updatePlayer
。函式將會更新列表中相關的玩家。
試試看
就是這些了,更改玩家等級所需的東西。試試看,前往編輯視界,點擊 - 及 + 按鈕。你會看到等級改變,若重新整理頁面,這些改變持續的儲存在 server。
截至目前為止應用程式要看起來像是 https://github.com/sporto/elm-tutorial-app/tree/018-08-edit