2017-12-16 25 views
2

elm tutorial에 대한 삭제 플레이어 메소드가 성공적으로 구현되었습니다. 그러나 서버에서 플레이어를 다시 얻는 메시지를 ForchFetch msg를 통해 수동으로 보내지 않고도 모델을 업데이트 할 수 없습니다.elm 모델의 값 삭제

내 삭제 버튼 :

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) 
+2

'ForceFetch'가 작동하는 경우 편집에 실패한 이유가 표시되지 않습니다. 응답이 '오류'가 아닌 '확인'으로 끝나야합니까? – Dogbert

+0

해결되었으므로 곧 답변을 업데이트하겠습니다. – Jimbo

+0

필터에서 플레이어 레코드를 비교하는 경우 서버에서 얻은 것과 일치하지 않을 수 있습니다. player.id 만 비교하면됩니다. – Sebastian

답변

1

, 그래서, 당신은 여기서

:

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

당신이 그것에서 플레이어를 제거하는 함수에 '모델'을 변경해야

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

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