【发布时间】:2022-01-01 16:42:22
【问题描述】:
有一对apples(List 类型)将在网络视图中公开他们自己。用户可以更新Apple 的任何size 属性。我有一个消息类型UpdateSize,它将通过onInput 触发。
编辑任何苹果只会触发消息而不知道要更新哪个苹果。
是否可以将id 属性传递给UpdateSize 消息?
感谢您阅读本文,Elm 很棒!
module Main exposing (main)
import Browser
import Html exposing (Html, button, div, text, input)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick,onInput)
import String
type alias Apple = {
size: Int}
type alias Model = {
apples: List(Apple)}
initialModel : Model
initialModel =
{ apples = [ Apple 10, Apple 11, Apple 12] }
type Msg
= UpdateSize String
update : Msg -> Model -> Model
update msg model =
case msg of
UpdateSize s -> {model | apples = ??? } -- how to update a single Apple with new size
_ -> model
viewApple : Apple -> Html Msg
viewApple a =
input [ type_ "text" ,placeholder ""
, value (String.fromInt a.size)
, onInput UpdateSize]
[]
view : Model -> Html Msg
view model =
div []
(List.map viewApple model.apples)
main : Program () Model Msg
main =
Browser.sandbox
{ init = initialModel
, view = view
, update = update
}
【问题讨论】:
-
请将所有相关代码放入问题本身。到 ellie 的链接很棒,但它应该是补充的。问题应该是独立的,这样即使外部资源被取消,它们仍然有意义。
-
至于你的问题,你怎么知道哪个苹果是哪个?确定 this apple 与 that apple 不同的属性或属性集是什么?
-
@glennsl 谢谢。我用apple做demo,我用size只是demo,不过也可以换成apple的
name,应该是唯一的。 -
我想了这么多,我的意思是,通过删除属性,您也删除了识别要更新的特定项目的方式。当然,您可以只使用列表索引,但在现实世界中,这通常是一个站不住脚的有缺陷的假设。例如,如果您要对视图中的项目进行排序或过滤,则索引将是错误的,您只能通过观察意外行为来判断。除非在其他地方确保名称的唯一性等,否则使用
name属性很容易出现重复。重点是:数据很重要。
标签: elm