我刚开始看到榆树与构建一个简单的Web应用程序的想法。我的想法需要在浏览器中保存一些用户数据。榆树中的数据持久性
有没有办法直接用Elm处理数据持久性?例如在浏览器会话甚至本地存储?或者我应该使用端口来使用JavaScript来完成它?
我刚开始看到榆树与构建一个简单的Web应用程序的想法。我的想法需要在浏览器中保存一些用户数据。榆树中的数据持久性
有没有办法直接用Elm处理数据持久性?例如在浏览器会话甚至本地存储?或者我应该使用端口来使用JavaScript来完成它?
你可以看看TheSeamau5's elm-storage。它可以将数据存储在本地存储中。
我会建议使用localStorage。在最新的elm中没有官方的支持(到现在为0.17),但你可以简单地通过ports来完成。这是通过端口使用本地存储为榆树0.17
port module Main exposing (..)
import Html exposing (Html, button, div, text, br)
import Html.App as App
import Html.Events exposing (onClick)
import String exposing (toInt)
main : Program Never
main = App.program
{
init = init
, view = view
, update = update
, subscriptions = subscriptions
}
type alias Model = Int
init : (Model, Cmd Msg)
init = (0, Cmd.none)
subscriptions : Model -> Sub Msg
subscriptions model = load Load
type Msg = Increment | Decrement | Save | Doload | Load String
port save : String -> Cmd msg
port load : (String -> msg) -> Sub msg
port doload :() -> Cmd msg
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Increment ->
(model + 1, Cmd.none)
Decrement ->
(model - 1, Cmd.none)
Save ->
(model, save (toString model))
Doload ->
(model, doload())
Load value ->
case toInt value of
Err msg ->
(0, Cmd.none)
Ok val ->
(val, Cmd.none)
view : Model -> Html Msg
view model =
div []
[ button [ onClick Decrement ] [ text "-" ]
, div [] [ text (toString model) ]
, button [ onClick Increment ] [ text "+" ]
, br [] []
, button [ onClick Save ] [ text "save" ]
, br [] []
, button [ onClick Doload ] [ text "load" ]
]
而且index.html的的工作示例(基于从官方文档一个例子)
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="js/elm.js"></script>
</head>
<body>
</body>
<script type="text/javascript">
var storageKey = "token";
var app = Elm.Main.fullscreen();
app.ports.save.subscribe(function(value) {
localStorage.setItem(storageKey, value);
});
app.ports.doload.subscribe(function() {
app.ports.load.send(localStorage.getItem(storageKey));
});
</script>
</html>
现在,请按按钮+/-你改变整型值。当你按下“保存”按钮时,应用程序将实际值存储到localStorage中(通过“token”键)。然后尝试刷新页面并按下“加载”按钮 - 它从localStorage取回值(您应该看到用恢复的值实现的HTML文本控件)。
检查'localStorage.getItem(storageKey)'为空可能更容易,如果为null,则可以将调用放到'app.ports.load.send'或传递一个空字符串。 – Gira
官方答案是“使用的端口”(例如这个页面上应在0.18的基本工作原理),而等待榆木的官方本地存储库的刊物:https://github.com/elm-lang/persistent-cache
这个例子使用的不再使用的信号... –