【问题标题】:deleting values from elm model从榆树模型中删除值
【发布时间】: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


【解决方案1】:

如果您不想在删除后获取模型,则需要更新代码中的模型,因此您有:

Msgs.Delete player ->
          (model, deletePlayerCmd player)

您需要将“模型”更改为可以从中移除播放器的函数:

    Msgs.Delete player ->
        (removePlayer player model, deletePlayerCmd player)

...
removePlayer : Player -> Model -> Model
...

【讨论】:

    猜你喜欢
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多