我想将程序的视图和更新部分分离为单独的源文件,但是,如何共享消息和订阅声明?
答案 0 :(得分:7)
在拆分模块之前请三思而后行,过早的代码拆分可能对您的项目有害。
以下是我在Elm应用程序中使用的项目结构的example。
Html.App.map允许我们为子组件标记消息,因此当键盘订阅发出消息时,我们可以将其传递给Components.Counter.Update.update
函数。
module App.View exposing (..)
import Html.App
import Html exposing (text, div, Html)
import App.Model exposing (Model)
import App.Messages exposing (..)
import Components.Counter.View
view : Model -> Html Msg
view model =
div []
[ Html.App.map Counter (Components.Counter.View.view model.counter) ]
要标记订阅中的邮件,我们必须使用Platform.Sub.map
请参阅src/App/Subscriptions.elm
module App.Subscriptions exposing (..)
import App.Model exposing (Model)
import App.Messages exposing (..)
import Components.Counter.Subscriptions
subscriptions : Model -> Sub Msg
subscriptions model =
let
counterSub =
Components.Counter.Subscriptions.subscriptions model.counter
in
Sub.batch [ Sub.map Counter counterSub ]
Main.elm -- Entry point, where App is initialized
Utils.elm -- Utilities
App/
Messages.elm
Model.elm
Subscriptions.elm
Update.elm
View.elm
Components/
StatefulComponent/
Messages.elm
Model.elm
Subscriptions.elm
Update.elm
View.elm
StatefulComponentWithCommands/
Commands.elm -- Functions, which return Cmd msg
Messages.elm
Model.elm
Subscriptions.elm
Update.elm
View.elm
StatelessComponent/
View.elm
答案 1 :(得分:1)
Elm程序可逐步拆分为多个文件,如下所示:
将消息声明和相关类型提取到Messages.elm
import Messages exposing (..)
中添加Main.elm
。 将模型声明和初始化提取到Models.elm
。
import Messages exposing (..)
。Models.elm
import Models exposing (..)
Main.elm
将view
函数提取到View.elm
。
import Messages exposing (..)
。View.elm
import Models exposing (..)
View.elm
import View exposing (..)
Main.elm
结束时,Main.elm
仍然拥有订阅和更新部分。它们可以被类似地提取出来。
请参阅github.com/sporto/elm-tutorial-app/tree/master/src上的示例,以及elm-tutorial.org/en/05-resources/01-intro.html处的相应教程。