2017-12-16 6 views
2

Ich habe erfolgreich eine Delete-Player-Methode für die elm tutorial implementiert. Allerdings kann ich das Modell nicht aktualisieren, ohne manuell eine ForchFetch msg (über einen Klick auf eine Schaltfläche) zu senden, die die Spieler vom Server wieder holt. Dies ist mein Code:Löschen von Werten aus Ulme Modell

Meine Schaltfläche Löschen:

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" ] 

Meine löschen Nachrichten:

type Msg = 
    | Delete Player 
    | OnDeletePlayer (Result Http.Error Player) 
    | ForceFetch 
    | OnFetchPlayers (WebData (List Player)) 

Meine Update-Funktion:

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 

Und für eine gute Maßnahme mein Modell:

type alias Model = 
    { players : WebData (List Player) 
    , route : Route 
    , newPlayerName : String 
    , newPlayerId : String 
    , newPlayerLevel : Int 
    } 

Edit:

ich ohne Erfolg versucht haben fetchPlayers auf folgende Weise mit eingebautem

Msgs.OnDeletePlayer (Ok player) -> 
      (updateDeletedPlayerList model player, fetchPlayers) 
+2

Wenn 'ForceFetch' funktioniert, sehe ich nicht, warum Ihr Versuch in Ihrer Bearbeitung nicht funktioniert. Sind Sie sicher, dass die Antwort am Ende "Ok" und nicht "Err" ist? – Dogbert

+0

Ich habe es gelöst, ich werde die Antwort in Kürze aktualisieren. – Jimbo

+0

Wenn Sie Player-Datensätze im Filter vergleichen, stimmen sie möglicherweise nicht überein, was Sie vom Server erhalten. Besser einen Vergleich nur für die player.id machen. – Sebastian

Antwort

1

Sie müssen das Modell in Ihrem Code aktualisieren, wenn Sie es nicht holen wollen nach dem Löschen, so, wo Sie haben:

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

Sie müssen sich ändern ‚Modell‘ auf eine Funktion, die den Spieler aus wird es entfernen:

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

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