我的应用中有以下类型:
type Page
= Welcome
| Cards
type alias Flags =
{ recipientName : String
, products : List Product
}
type alias Product =
{ id : Int
, name : String
, price : Float
, liked : Maybe Bool
}
type alias Model =
{ recipientName : String
, currentPage : Page
, products : List Product
}
我将一系列产品作为标志传递。这是我init
的样子:
init : Flags -> ( Model, Cmd Msg )
init flags =
let
{ recipientName, products } =
flags
in
Model recipientName Welcome products
|> withNoCmd
我面临的挑战是,此阵列中的产品只有id
,name
和price
属性。因此,给定Flags
定义,每次使用新属性(例如Product
)扩展liked
时,作为标志传递的产品数组也需要具有该属性。现在,我只是将它们渲染为空,但这感觉不对,所以我想知道接收标志并将它们转换为模型的Elm方式是什么?谢谢!
答案 0 :(得分:1)
听起来您的Product
已被定义为应用的输入(或环境):
type alias Product =
{ id : Int
, name : String
, price : Float
}
并且您正在使用将收件人与产品相关联的信息来扩充此功能。我建议将其拆分为自己的类型,随着应用程序的增长而增长,例如:
type alias Opinion =
{ liked : Maybe Bool
, review : String
, preferredColor : Color
}
然后您可以在Model
:
type alias Model =
{ recipientName : String
, currentPage : Page
, products : List (Product, Opinion)
}
或者,根据应用程序的工作原理,您最终可能希望通过product.id
查找收件人的意见:
...
, products : List Product
, opinions : Dict Int Opinion
关键在于,如果保持原始Product
不变,您可以构建一个小型函数库,这些函数可用于Product
,包括库存(不涉及收件人)和客户。也许您可以将Opinion
类型重新用于客户指标。
如果这两种类型可能会发展,将它们分开可以帮助确保您最终不会出现混乱和吸引错误的相互依赖性。