在 Elm 中,如何在页面路由到后触发 Cmd?
In Elm, how do I fire a Cmd once a page has been routed to?
我有一个包含图表的页面的 Elm SPA。我正在使用 JS 端口来激活 chart.js 图表。加载页面后,我想通过端口发送图表数据。我能够在事件上很好地连接命令(例如 select 更改),但是我不知道如何在页面加载时触发命令。
我尝试在我的应用程序的 init 中连接命令,但当然这会在我检索我的应用程序数据之前触发。
非常感谢!
一些示例代码:
(我正在使用 "chart" 创建 Cmd,其中是我的端口名称,它带有基于我的模型的图表数据。)
Main.elm
init : Result String Route -> ( Model, Cmd Msg )
init result =
let
currentRoute =
Routing.routeFromResult result
in
( initialModel currentRoute, Cmd.map VendorsMsg fetchAll )
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
urlUpdate : Result String Route -> Model -> ( Model, Cmd Msg )
urlUpdate result model =
let
currentRoute =
Routing.routeFromResult result
in
( { model | route = currentRoute }, chart (computeChartData model) )
main : Program Never
main =
Navigation.program Routing.parser
{ init = init
, view = view
, update = update
, urlUpdate = urlUpdate
, subscriptions = subscriptions
}
Routing.elm
type Route
= HomeRoute
| AdminRoute
| EditVendorRoute VendorId
| NotFoundRoute
matchers : Parser (Route -> a) a
matchers =
oneOf
[ format HomeRoute (s "")
, format EditVendorRoute (s "admin" </> int)
, format AdminRoute (s "admin")
]
hashParser : Navigation.Location -> Result String Route
hashParser location =
location.hash
|> String.dropLeft 1
|> parse identity matchers
parser : Navigation.Parser (Result String Route)
parser =
Navigation.makeParser hashParser
routeFromResult : Result String Route -> Route
routeFromResult result =
case result of
Ok route ->
route
Err string ->
NotFoundRoute
您应该能够在 init
函数期间触发您的 chart
端口,给定您的初始模型:
init : Result String Route -> ( Model, Cmd Msg )
init result =
let
currentRoute =
Routing.routeFromResult result
model =
initialModel currentRoute
in
( model, Cmd.batch [ Cmd.map VendorsMsg fetchAll, chart (computeChartData model) ] )
即使您在浏览器中手动输入 URL,这也能确保端口被触发。
您可以使用标志在页面加载时将初始数据传递给您的程序。因此,如果您担心页面加载时需要初始数据,只需将其传递到 elm 代码即可。
我有一个包含图表的页面的 Elm SPA。我正在使用 JS 端口来激活 chart.js 图表。加载页面后,我想通过端口发送图表数据。我能够在事件上很好地连接命令(例如 select 更改),但是我不知道如何在页面加载时触发命令。
我尝试在我的应用程序的 init 中连接命令,但当然这会在我检索我的应用程序数据之前触发。
非常感谢!
一些示例代码: (我正在使用 "chart" 创建 Cmd,其中是我的端口名称,它带有基于我的模型的图表数据。)
Main.elm
init : Result String Route -> ( Model, Cmd Msg )
init result =
let
currentRoute =
Routing.routeFromResult result
in
( initialModel currentRoute, Cmd.map VendorsMsg fetchAll )
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
urlUpdate : Result String Route -> Model -> ( Model, Cmd Msg )
urlUpdate result model =
let
currentRoute =
Routing.routeFromResult result
in
( { model | route = currentRoute }, chart (computeChartData model) )
main : Program Never
main =
Navigation.program Routing.parser
{ init = init
, view = view
, update = update
, urlUpdate = urlUpdate
, subscriptions = subscriptions
}
Routing.elm
type Route
= HomeRoute
| AdminRoute
| EditVendorRoute VendorId
| NotFoundRoute
matchers : Parser (Route -> a) a
matchers =
oneOf
[ format HomeRoute (s "")
, format EditVendorRoute (s "admin" </> int)
, format AdminRoute (s "admin")
]
hashParser : Navigation.Location -> Result String Route
hashParser location =
location.hash
|> String.dropLeft 1
|> parse identity matchers
parser : Navigation.Parser (Result String Route)
parser =
Navigation.makeParser hashParser
routeFromResult : Result String Route -> Route
routeFromResult result =
case result of
Ok route ->
route
Err string ->
NotFoundRoute
您应该能够在 init
函数期间触发您的 chart
端口,给定您的初始模型:
init : Result String Route -> ( Model, Cmd Msg )
init result =
let
currentRoute =
Routing.routeFromResult result
model =
initialModel currentRoute
in
( model, Cmd.batch [ Cmd.map VendorsMsg fetchAll, chart (computeChartData model) ] )
即使您在浏览器中手动输入 URL,这也能确保端口被触发。
您可以使用标志在页面加载时将初始数据传递给您的程序。因此,如果您担心页面加载时需要初始数据,只需将其传递到 elm 代码即可。