Elm 从 json 响应更新模型
Elm updating model from json response
我在通过我的一个操作从 JSON 响应更新模型时遇到问题。
这是设置:
我有这样的模型:
type alias Model =
{ totals: Totals.Total // all values are initialized as 0 or 0.0
}
-- In other module
type alias Total =
{ days : Int
, avgPerDay: Float
, reports : Int
, people : Int
, locations : Int
, totalCoffees : Int
, coffeesPerDay: Float
}
所述模型的解码器:
decodeTotal : Json.Decoder Total
decodeTotal =
object7 Total
("days" := Json.int)
("avgPerDay" := Json.float)
("reports" := Json.int)
("people" := Json.int)
("locations" := Json.int)
("totalCoffees" := Json.int)
("coffeesPerDay" := Json.float)
要更新模型,调用以下 Http 请求:
getTotals : Effects Action
getTotals =
Http.get Totals.decodeTotal ("/reports/totals")
|> Task.toMaybe
|> Task.map TotalsFetched
|> Effects.task
来自服务器的响应是 200 OK 正文:{"days":347,"reports":1793,"avgPerDay":5.167147,"people":205,"locations":332,"coffees":146,"coffeesPerDay":0.42074928}
但是,在 TotalsFetched
操作中:
update : Action -> Model -> (Model, Effects Action)
update action model =
case action of
TotalsFetched totals ->
log (toString totals) -- logs Nothing
( { model | totals = Maybe.withDefault model.totals totals }
, Effects.none
)
我假设因为 totals
是 Nothing
,我的模型就保持在 Maybe.withDefault
中描述的那样
我不明白为什么 totals
是 Nothing 而不是来自服务器的 Decoded 响应。这是我的第一个榆树项目,所以如果我遗漏了一些对训练有素的人来说非常明显的东西,我不会感到惊讶。
您的 json 正在返回一个名为 coffees
的字段,而您的解码器正在寻找 totalCoffees
.
您可能要考虑使用 Task.toResult
而不是 Task.toMaybe
,因为这样您会在出现问题时收到返回的错误消息。
我在通过我的一个操作从 JSON 响应更新模型时遇到问题。 这是设置:
我有这样的模型:
type alias Model =
{ totals: Totals.Total // all values are initialized as 0 or 0.0
}
-- In other module
type alias Total =
{ days : Int
, avgPerDay: Float
, reports : Int
, people : Int
, locations : Int
, totalCoffees : Int
, coffeesPerDay: Float
}
所述模型的解码器:
decodeTotal : Json.Decoder Total
decodeTotal =
object7 Total
("days" := Json.int)
("avgPerDay" := Json.float)
("reports" := Json.int)
("people" := Json.int)
("locations" := Json.int)
("totalCoffees" := Json.int)
("coffeesPerDay" := Json.float)
要更新模型,调用以下 Http 请求:
getTotals : Effects Action
getTotals =
Http.get Totals.decodeTotal ("/reports/totals")
|> Task.toMaybe
|> Task.map TotalsFetched
|> Effects.task
来自服务器的响应是 200 OK 正文:{"days":347,"reports":1793,"avgPerDay":5.167147,"people":205,"locations":332,"coffees":146,"coffeesPerDay":0.42074928}
但是,在 TotalsFetched
操作中:
update : Action -> Model -> (Model, Effects Action)
update action model =
case action of
TotalsFetched totals ->
log (toString totals) -- logs Nothing
( { model | totals = Maybe.withDefault model.totals totals }
, Effects.none
)
我假设因为 totals
是 Nothing
,我的模型就保持在 Maybe.withDefault
我不明白为什么 totals
是 Nothing 而不是来自服务器的 Decoded 响应。这是我的第一个榆树项目,所以如果我遗漏了一些对训练有素的人来说非常明显的东西,我不会感到惊讶。
您的 json 正在返回一个名为 coffees
的字段,而您的解码器正在寻找 totalCoffees
.
您可能要考虑使用 Task.toResult
而不是 Task.toMaybe
,因为这样您会在出现问题时收到返回的错误消息。