繁体   English   中英

从顶级模型访问值

[英]Access values from top level model

我正在创建我的第一个榆树应用程序。 它是一个具有多个页面的网站,以及一个用于导航到可用页面的侧栏/顶部栏。 我有一个看起来像这样的顶级模型:

顶级模型

我正在创建一个显示用户用户名的顶部栏。 用户名在组件模型中: components model 我特意只在这个模型中定义用户名,因为我只想调用它一次,并且只在“顶部导航栏”中使用它。

在顶级视图功能中,我有一个创建顶部和侧栏的功能,然后显示相应的页面。 查看功能

我的问题是,我想从组件模型中提取用户名并将其作为字符串通过“TopBar.viewTopbar”函数提供。 我正在努力从组件模型中获取此值,因为顶级视图函数中的模型字段是包含模型列表的联合类型。 有谁知道获取“用户名”值的最佳方法,以便它可以显示在每个页面上都会看到的顶部栏上?

我不确定您是否会对我的回答感到满意,但如果您想在每个顶级视图中呈现一个字符串,那么该值也必须存在于每个顶级模型中。

所以你要么需要有这样的东西

username : Model -> String
username global =
    case global of
        Redirect model ->
            model.username
        NotFound session ->
            session.user.name
        Login model ->
            "invalid state"
        ...

或更改您的顶级数据结构。

我建议更改您的顶级数据结构,因为我假设您将来还想将其他数据传递给Sidebar.viewSidebarTopbar.viewTopbar函数,例如在菜单中突出显示当前访问的页面。

我的初稿可能看起来像这样:

type alias Model =
    { session: Session
    , currentPage: Page
    }

type Session
    = Anonymous
    | User { name: String, avatar: Maybe String }

type Page = Login | Loggedout | Root | PageA

为了进一步学习,我建议观看两个讲座:

Richard Feldman 的“Make data structures”中,他谈到了结构化代码以及尝试创建独立组件如何导致复杂且容易出错的代码(链接显示了不可能状态的示例)。
Elm 的创建者 Evan Czalicki 的“Life of a file”中,他谈到了当他不尝试从头开始创建组件或引入抽象,而是尝试在单个文件中工作时,他的编码如何工作得最好在拆分代码之前可能。 然后仅根据需要提取数据结构和处理它们的代码(而不是例如在文件系统中看起来相似)。

在 Elm 中,拥有许多小模块比拥有很少的非常长的模块更经常是一种反模式。 >1000 行不被认为是不好的做法。

您可能还想看看这个讨论主题,其中多人分享他们如何构建文件夹结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM