Elm - Получить данные списка JSON
Я пытаюсь получить список данных JSON с этого URL: https://raw.githubusercontent.com/raywenderlich/recipes/master/Recipes.json
Я не мог понять, что делать в этой ситуации
...
main =
App.program
{ init = init
, view = view
, update = update
, subscriptions = \_ -> Sub.none
}
-- MODEL
type alias Model =
{ name : String
, imageURL: String
}
init =
(Model "" "", Cmd.none)
-- UPDATE
type Msg
= Recipes
| FetchSucceed (List Model)
| FetchFail Http.Error
update msg model =
case msg of
Recipes ->
(model, fetchRecipes)
FetchSucceed recipe ->
(recipe, Cmd.none)
FetchFail _ ->
(model, Cmd.none)
-- VIEW
view model =
div []
[ ul [] (List.map getItem model)
]
getItem item =
li [] [ text item.name ]
-- HTTP
fetchRecipes =
let
url =
"https://raw.githubusercontent.com/raywenderlich/recipes/master/Recipes.json"
in
Task.perform FetchFail FetchSucceed (Http.get decodeListRecipes url)
decodeRecipes =
Json.object2 Model
("name" := Json.string)
("imageURL" := Json.string)
decodeListRecipes =
Json.list decodeRecipes
Но я продолжаю получать эту ошибку:
Function `program` is expecting the argument to be:
{ ...,
update :
Msg
-> { imageURL : String, name : String }
-> ( { imageURL : String, name : String }, Cmd Msg ) ,
view : { imageURL : String, name : String } -> Html Msg
}
But it is:
{ ...
, update : Msg -> List Model -> ( List Model, Cmd Msg )
, view : List { a | name : String } -> Html b
}
1 ответ
Решение
Ваш FetchSucceed
тег определяется как наличие списка моделей (FetchSucceed (List Model)
), но в вашем update
функция, которую вы рассматриваете, как если бы это была одна модель, а не список. Если я изменю значение на множественное число, оно должно подчеркнуть проблемную область:
FetchSucceed recipes ->
(recipes, Cmd.none)
Не зная точно, что вы пытаетесь достичь, я могу лишь дать подсказку о потенциальном решении, например, если вы просто хотели взять первый элемент списка и вернуться к текущей модели, если не было возвращено никаких рецептов, вы может сделать что-то вроде этого:
FetchSucceed recipes ->
let recipe =
case List.head recipes of
Just r -> r
Nothing -> model
in
(recipe, Cmd.none)