簡體   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