将标志转换为模型的Elm方式

时间:2017-09-20 05:05:48

标签: elm

我的应用中有以下类型:

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

我面临的挑战是,此阵列中的产品只有idnameprice属性。因此,给定Flags定义,每次使用新属性(例如Product)扩展liked时,作为标志传递的产品数组也需要具有该属性。现在,我只是将它们渲染为空,但这感觉不对,所以我想知道接收标志并将它们转换为模型的Elm方式是什么?谢谢!

1 个答案:

答案 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类型重新用于客户指标。

如果这两种类型可能会发展,将它们分开可以帮助确保您最终不会出现混乱和吸引错误的相互依赖性。