First of all, let’s try to see if the definition of Browser.element
has any new elements compared to Browser.sandbox
.
1 2 3 4 5 6 7 8 | <span class="token hvariable">element</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token hvariable">init</span> <span class="token operator">:</span> <span class="token hvariable">flags</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token hvariable">model</span> <span class="token punctuation">,</span> <span class="token constant">Cmd</span> <span class="token hvariable">msg</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token hvariable">view</span> <span class="token operator">:</span> <span class="token hvariable">model</span> <span class="token operator">-></span> <span class="token constant">Html</span> <span class="token hvariable">msg</span> <span class="token punctuation">,</span> <span class="token hvariable">update</span> <span class="token operator">:</span> <span class="token hvariable">msg</span> <span class="token operator">-></span> <span class="token hvariable">model</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token hvariable">model</span> <span class="token punctuation">,</span> <span class="token constant">Cmd</span> <span class="token hvariable">msg</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token hvariable">subscriptions</span> <span class="token operator">:</span> <span class="token hvariable">model</span> <span class="token operator">-></span> <span class="token constant">Sub</span> <span class="token hvariable">msg</span> <span class="token punctuation">}</span> <span class="token operator">-></span> <span class="token constant">Program</span> <span class="token hvariable">flags</span> <span class="token hvariable">model</span> <span class="token hvariable">msg</span> |
init
– now takes the form of taking a parameter namedflags
and returning aTuple (model, Cmd msg)
.view
– nothing changes and still takes a single input parameter of amodel
record to generate anHTML msg
structure.update
– still accepts anmsg
event message sent by theBrowser.element
main driver and returns aTuple (model, Cmd msg)
.subscriptions
– takes amodel
record and generates a browser event trackerSub msg
.- And finally the return result of the
Browser.element
packager – is aProgram
that takes the parametersflags
,model
,msg
.
Flags
The uses of Cmd
and Sub
we have mentioned before, and here we are adding a new element that is flags
– roughly translated as flag values - appearing in the init
and Program
results. As such, flags
will be passed in from the environment outside the Program
and used for the init
initializer when the user loads the page for the first time.
To attach a Program
that has been compiled into an element.js
file to a previously built website, we still do the same as when using Browser.sandbox
. That is to create an HTML element with a specified id
and pass it to the Program
initialization directive.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> html</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> head</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> meta</span> <span class="token attr-name">charset</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> UTF-8 <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> title</span> <span class="token punctuation">></span></span> Main <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> title</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token attr-name">src</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> elm-time.js <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> head</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> body</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> elm-time <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">var</span> app <span class="token operator">=</span> Elm <span class="token punctuation">.</span> Main <span class="token punctuation">.</span> <span class="token function">init</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> node <span class="token operator">:</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">"elm-time"</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> flags <span class="token operator">:</span> Date <span class="token punctuation">.</span> <span class="token function">now</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> body</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> html</span> <span class="token punctuation">></span></span> |
That’s how we pass content initialization data into an Element
. This is very important, because often we will want to create Element
that can be reused many times. And so the configurable data that Element
works on – should not be written permanently into the code that handles the logic of Element
.
For example, you might want to create a Navbar
with Elm
and the data to create specific content for the Navbar
will be passed in at initialization time as shown in the example code above. Or, we’ll just pass in a single URL
that points to an API
that provides a list of the website’s Category
headings in JSON
format.
That way the Element
that you build will be able to be shared for use by other websites and the users of your code won’t need to read Elm
. Finding a place to put static content in Elm
code will no longer be a necessity, and it is also a common desire when we write any program, in any language.
HTTP Request
Now let’s look at the example of a simple Element
that sends an HTTP request
to a server
to get the content, introduced by Elm
in the documentation.
Here we have a Reader
text display with architectural elements that work a little differently than Sandboxed Buttons
. The program starts at Main
with the flags
parameter temporarily blank because we don’t need to attach this Element
to any web page yet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">module</span> <span class="token constant">Main</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token hvariable">main</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Browser <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Http <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token comment">-- MAIN - - - - - - - - - - - - - - - - - -</span> <span class="token hvariable">main</span> <span class="token operator">:</span> <span class="token constant">Program</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token constant">Model</span> <span class="token constant">Msg</span> <span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token hvariable">Browser.element</span> <span class="token punctuation">(</span> <span class="token constant">Reader</span> <span class="token hvariable">init</span> <span class="token hvariable">update</span> <span class="token hvariable">subscriptions</span> <span class="token hvariable">view</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> <span class="token keyword">alias</span> <span class="token constant">Reader</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token hvariable">init</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token punctuation">,</span> <span class="token constant">Cmd</span> <span class="token constant">Msg</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token hvariable">update</span> <span class="token operator">:</span> <span class="token constant">Msg</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token punctuation">,</span> <span class="token constant">Cmd</span> <span class="token constant">Msg</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token hvariable">subscriptions</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Sub</span> <span class="token constant">Msg</span> <span class="token punctuation">,</span> <span class="token hvariable">view</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Html</span> <span class="token constant">Msg</span> <span class="token punctuation">}</span> |
Immediately after that, init
will be fired to create the first status record with the command to send the request to the text content query over HTTP
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token comment">-- INIT - - - - - - - - - - - - - - - - - -</span> <span class="token keyword">type</span> <span class="token constant">Model</span> <span class="token operator">=</span> <span class="token constant">Loading</span> <span class="token operator">|</span> <span class="token constant">Failure</span> <span class="token operator">|</span> <span class="token constant">Success</span> <span class="token constant">String</span> <span class="token keyword">type</span> <span class="token constant">Msg</span> <span class="token operator">=</span> <span class="token constant">GotResponse</span> <span class="token punctuation">(</span> <span class="token constant">Result</span> <span class="token constant">Http.Error</span> <span class="token constant">String</span> <span class="token punctuation">)</span> <span class="token hvariable">init</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token punctuation">,</span> <span class="token constant">Cmd</span> <span class="token constant">Msg</span> <span class="token punctuation">)</span> <span class="token hvariable">init</span> _ <span class="token operator">=</span> <span class="token keyword">let</span> <span class="token hvariable">command</span> <span class="token operator">=</span> <span class="token hvariable">Http.get</span> <span class="token punctuation">{</span> <span class="token hvariable">url</span> <span class="token operator">=</span> <span class="token string">"https://elm-lang.org/assets/public-opinion.txt"</span> <span class="token punctuation">,</span> <span class="token hvariable">expect</span> <span class="token operator">=</span> <span class="token hvariable">Http.expectString</span> <span class="token constant">GotResponse</span> <span class="token punctuation">}</span> <span class="token keyword">in</span> <span class="token punctuation">(</span> <span class="token constant">Loading</span> <span class="token punctuation">,</span> <span class="token hvariable">command</span> <span class="token punctuation">)</span> |
Thus, the record value that init
initially initializes will be any value of type Loading
and will be passed to the view
by the Program
. Immediately after initializing the Loading
value, init
also sends a request to query the content over HTTP
. As soon as the query results are available, the Program
will pass a value of type Cmd Msg
to the update
.
1 2 3 4 5 6 7 8 | <span class="token comment">-- VIEW - - - - - - - - - - - - - - - - - -</span> <span class="token hvariable">view</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Html</span> <span class="token constant">Msg</span> <span class="token hvariable">view</span> <span class="token hvariable">model</span> <span class="token operator">=</span> <span class="token keyword">case</span> <span class="token hvariable">model</span> <span class="token keyword">of</span> <span class="token constant">Loading</span> <span class="token operator">-></span> <span class="token hvariable">text</span> <span class="token string">"Loading..."</span> <span class="token constant">Failure</span> <span class="token operator">-></span> <span class="token hvariable">text</span> <span class="token string">"I was unable to load your book."</span> <span class="token constant">Success</span> <span class="token hvariable">fullText</span> <span class="token operator">-></span> <span class="token hvariable">pre</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token hvariable">text</span> <span class="token hvariable">fullText</span> <span class="token punctuation">]</span> |
In this example the view
will generate the HTML
structure by Pattern Matching
the input record type. Initially, when receiving the Loading
type, it will only show the words "Loading..."
. Other data pattern
instances may appear when the update
is activated.
1 2 3 4 5 6 7 | <span class="token comment">-- UPDATE - - - - - - - - - - - - - - - - - -</span> <span class="token hvariable">update</span> <span class="token operator">:</span> <span class="token constant">Msg</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token punctuation">,</span> <span class="token constant">Cmd</span> <span class="token constant">Msg</span> <span class="token punctuation">)</span> <span class="token hvariable">update</span> <span class="token hvariable">msg</span> <span class="token hvariable">model</span> <span class="token operator">=</span> <span class="token keyword">case</span> <span class="token hvariable">msg</span> <span class="token keyword">of</span> <span class="token constant">GotResponse</span> <span class="token punctuation">(</span> <span class="token constant">Err</span> _ <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token constant">Failure</span> <span class="token punctuation">,</span> <span class="token hvariable">Cmd.none</span> <span class="token punctuation">)</span> <span class="token constant">GotResponse</span> <span class="token punctuation">(</span> <span class="token constant">Ok</span> <span class="token hvariable">txt</span> <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token constant">Success</span> <span class="token hvariable">txt</span> <span class="token punctuation">,</span> <span class="token hvariable">Cmd.none</span> <span class="token punctuation">)</span> |
Here we have only one case where the GotResponse
update
of the HTTP Request
is sent. After creating a new Model
record of Failure
or Success txt
, we do not need to trigger any more interactive commands Cmd.none
. The new Model
record according to the processing cycle that we already know will be sent to the view
to update the display content.
1 2 3 4 5 | <span class="token comment">-- SUBSCRIPTIONS - - - - - - - - - - - - - - - - - -</span> <span class="token hvariable">subscriptions</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Sub</span> <span class="token constant">Msg</span> <span class="token hvariable">subscriptions</span> <span class="token hvariable">model</span> <span class="token operator">=</span> <span class="token hvariable">Sub.none</span> |
The final architectural element is subscriptions
that are not yet in use and are represented by the value Sub.none
which is meaningless to the Program
driver.
1 2 3 | cd Documents && cd learn-elm elm reactor |
http://localhost:8000/src/Main.elm
Currently the public-opinion.txt
file provided at the URL
provided by Elm
in the init
is still available and you will see the words "Loading..."
which will only be displayed for a short period of time shortly after. when the web page is downloaded. Then the displayed content will be updated as shown in the screenshot.
Cmd & Sub
As we have seen, the command message element Cmd Msg
has made the operation logic of the Program
created by Browser.element
much more flexible than that of Browser.sandbox
.
Msg
event messages can be sent from many different points in the program – at the end of the first Model
record initialization, when the user interacts with the Html Msg
structure generated by the view
, when terminates each case
of the update
program itself, and when the Sub Msg
becomes aware of an event occurring in the web browser environment overview.
So the remaining element that we need to learn is subscriptions
– the generator Sub Msg
keeps track of events happening in the overview web browser environment. So what types of events can be attached to Sub Msg
? All are listed here: Browser.Events
onClick
– when a click occurs anywhere in the web pageonMouseMove
– when the user moves the mouse pointer anywhereonMouseDown
– when user presses down on left/right mouse button anywhereonMouseUp
– when the user releases the mouse button anywhereonKeyPress
– when the user presses any key and releasesonKeyDown
– when the user presses any keyonKeyUp
– when the user releases any keyonAnimationFrame
– whenanimation
is activeonResize
– when the user narrows or expands the browser windowonVisibilityChange
– when the visibility of the browser window changes
In fact, Sub Msg
can also be generated from other programs such as Time.every
provided by package: elm/time
. And so the Program
will now have quite a lot of ability to interact with the external environment.
Now let’s look at another example that Elm
put on the homepage to better understand the Cmd/Sub/Msg
elements.
1 2 | elm install elm/time |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | module Main exposing (main) import Browser exposing (..) import Time exposing (..) import Task exposing (..) import Html exposing (..) -- MAIN - - - - - - - - - - - - - - - - - - main : Program () Model Msg main = Browser.element (Clock init view update subscriptions) type alias Clock = { init : () -> (Model, Cmd Msg) , view : Model -> Html Msg , update : Msg -> Model -> (Model, Cmd Msg) , subscriptions : Model -> Sub Msg } |
Here we will create a simple clock by querying time information from the system then updating the display status every second. Since we do not need to use the input parameter when initializing the Program
, we will still leave the flags
parameter blank.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">-- INIT - - - - - - - - - - - - - - - - - -</span> <span class="token keyword">type</span> <span class="token keyword">alias</span> <span class="token constant">Model</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token hvariable">zone</span> <span class="token operator">:</span> <span class="token constant">Time.Zone</span> <span class="token punctuation">,</span> <span class="token hvariable">time</span> <span class="token operator">:</span> <span class="token constant">Time.Posix</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> <span class="token constant">Msg</span> <span class="token operator">=</span> <span class="token constant">Tick</span> <span class="token constant">Time.Posix</span> <span class="token operator">|</span> <span class="token constant">AdjustTimeZone</span> <span class="token constant">Time.Zone</span> <span class="token hvariable">init</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token punctuation">,</span> <span class="token constant">Cmd</span> <span class="token constant">Msg</span> <span class="token punctuation">)</span> <span class="token hvariable">init</span> _ <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token hvariable">Time.utc</span> <span class="token punctuation">(</span> <span class="token hvariable">Time.millisToPosix</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token hvariable">Task.perform</span> <span class="token constant">AdjustTimeZone</span> <span class="token hvariable">Time.here</span> <span class="token punctuation">)</span> |
In addition to the aforementioned module Time
, the init
program also uses the module Task
in package: elm/core
, to perform a task that is delayed slightly after initializing the first Model
record. It is the operation of adjusting the time zone to suit the user’s current location on earth.
1 2 3 4 5 6 7 8 9 | <span class="token comment">-- VIEW - - - - - - - - - - - - - - - - - -</span> <span class="token hvariable">view</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Html</span> <span class="token constant">Msg</span> <span class="token hvariable">view</span> <span class="token hvariable">model</span> <span class="token operator">=</span> <span class="token keyword">let</span> <span class="token hvariable">hour</span> <span class="token operator">=</span> <span class="token hvariable">String.fromInt</span> <span class="token punctuation">(</span> <span class="token hvariable">Time.toHour</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">zone</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">time</span> <span class="token punctuation">)</span> <span class="token hvariable">minute</span> <span class="token operator">=</span> <span class="token hvariable">String.fromInt</span> <span class="token punctuation">(</span> <span class="token hvariable">Time.toMinute</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">zone</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">time</span> <span class="token punctuation">)</span> <span class="token hvariable">second</span> <span class="token operator">=</span> <span class="token hvariable">String.fromInt</span> <span class="token punctuation">(</span> <span class="token hvariable">Time.toSecond</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">zone</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">time</span> <span class="token punctuation">)</span> <span class="token keyword">in</span> <span class="token hvariable">h1</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token hvariable">text</span> <span class="token punctuation">(</span> <span class="token hvariable">hour</span> <span class="token operator">++</span> <span class="token string">":"</span> <span class="token operator">++</span> <span class="token hvariable">minute</span> <span class="token operator">++</span> <span class="token string">":"</span> <span class="token operator">++</span> <span class="token hvariable">second</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> |
The simple Html Msg
structure is generated by the view
with a single <h1>
tag containing the timing information from the passed Model
record.
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment">-- UPDATE - - - - - - - - - - - - - - - - - -</span> <span class="token hvariable">update</span> <span class="token operator">:</span> <span class="token constant">Msg</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token punctuation">,</span> <span class="token constant">Cmd</span> <span class="token constant">Msg</span> <span class="token punctuation">)</span> <span class="token hvariable">update</span> <span class="token hvariable">msg</span> <span class="token hvariable">model</span> <span class="token operator">=</span> <span class="token keyword">case</span> <span class="token hvariable">msg</span> <span class="token keyword">of</span> <span class="token constant">AdjustTimeZone</span> <span class="token hvariable">newZone</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token hvariable">model</span> <span class="token operator">|</span> <span class="token hvariable">zone</span> <span class="token operator">=</span> <span class="token hvariable">newZone</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token hvariable">Cmd.none</span> <span class="token punctuation">)</span> <span class="token constant">Tick</span> <span class="token hvariable">time</span> <span class="token operator">-></span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token hvariable">model</span> <span class="token operator">|</span> <span class="token hvariable">time</span> <span class="token operator">=</span> <span class="token hvariable">time</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token hvariable">Cmd.none</span> <span class="token punctuation">)</span> |
The AdjustTimeZone
time zone adjustment task is started by init
, once done, sends Cmd Msg
to Program
and then Msg
is sent to update
to update the display information. At this point, update
will create a new Model
record and stop the Cmd Msg
interactive command loop with Cmd.none
.
In addition, the update
has an instance of Msg
being sent of type Tick time
generated by subscriptions
.
1 2 3 4 5 | <span class="token comment">-- SUBSCRIPTIONS - - - - - - - - - - - - - - - - - -</span> <span class="token hvariable">subscriptions</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Sub</span> <span class="token constant">Msg</span> <span class="token hvariable">subscriptions</span> _ <span class="token operator">=</span> <span class="token hvariable">Time.every</span> <span class="token number">1000</span> <span class="token constant">Tick</span> |
After every 1000 ms
, the Sub Msg
generated by Tick
will send Msg
to the main driver Program
and Msg
continues to be passed to the update
to execute the rest of the case
.
http://localhost:8000/src/Main.elm
Thus, we have reviewed the new points in the architecture of Browser.element
. These are also essential elements so that we can create Element
elements for the website we built before.
(unpublished) [Declarative Programming + Elm] Lesson 14 – Wiki Element (prologue)