Như đã nói trước đó thì chúng ta sẽ không thể trực tiếp định nghĩa một hàm thay đổi nội dung của phần tử <head>
bởi vì các trình đóng gói của Elm
đều không cung cấp giao diện lập trình hỗ trợ. Tuy nhiên, khi người dùng nhấn vào một liên kết bất kỳ trong trang web và nội dung đã được thay đổi để đáp ứng lại yêu cầu đó thì chúng ta cũng cần phải quan tâm tới một vài yếu tố mô tả quan trọng khác.
Ví dụ điển hình là tên của trang đơn được gắn ở thẻ <title>
, hoặc xa hơn thì sẽ là các thẻ <meta>
mô tả nội dung của trang đơn mà người dùng vừa chuyển tới để chương trình tự động duyệt web của các dịch vụ tìm kiếm Google, Bing, v.v… có thể dễ dàng xếp loại được nội dung của mỗi trang đơn có mặt trong tập dữ liệu.
Và giải pháp ở đây là chúng ta sẽ cần một phương thức để tương tác 2 chiều với code JavaScript
bên ngoài. Tức là ở thời điểm code Elm
cần thực hiện một tác vụ như trên thì chúng ta có thể gửi yêu cầu ủy thác cho code JavaScript
hoặc gọi một hàm được định nghĩa bằng code JavaScript
.
Elm Ports & WebSocket
Elm
có hỗ trợ một phương thức để gửi/nhận yêu cầu với code JavaScript
qua các cổng port
được khai báo như code ví dụ dưới đây. Chúng ta sẽ tạo ra một cổng thông tin gửi/nhận với code JavaScript
được tạo ra bởi từ khóa port
ở dòng đầu tiên khai báo module Main
và ở định nghĩa của các hàm sendMessage
và messageReceiver
ngay sau phần import
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | <span class="token hvariable">port</span> <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 operator">..</span><span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Browser</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 import-statement"><span class="token keyword">import</span> Html.Attributes <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.Events <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> Json.Decode <span class="token keyword">as</span> D</span> <span class="token comment">-- PORTS - - - - - - - - -</span> <span class="token hvariable">port</span> <span class="token hvariable">sendMessage</span> <span class="token operator">:</span> <span class="token constant">String</span> <span class="token operator">-></span> <span class="token constant">Cmd</span> <span class="token hvariable">msg</span> <span class="token hvariable">port</span> <span class="token hvariable">messageReceiver</span> <span class="token operator">:</span> <span class="token punctuation">(</span><span class="token constant">String</span> <span class="token operator">-></span> <span class="token hvariable">msg</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token constant">Sub</span> <span class="token hvariable">msg</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 hvariable">init</span> <span class="token operator">=</span> <span class="token hvariable">init</span> <span class="token punctuation">,</span> <span class="token hvariable">view</span> <span class="token operator">=</span> <span class="token hvariable">view</span> <span class="token punctuation">,</span> <span class="token hvariable">update</span> <span class="token operator">=</span> <span class="token hvariable">update</span> <span class="token punctuation">,</span> <span class="token hvariable">subscriptions</span> <span class="token operator">=</span> <span class="token hvariable">subscriptions</span> <span class="token punctuation">}</span> <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">draft</span> <span class="token operator">:</span> <span class="token constant">String</span> <span class="token punctuation">,</span> <span class="token hvariable">messages</span> <span class="token operator">:</span> <span class="token constant">List</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 hvariable">flags</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token hvariable">draft</span> <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token hvariable">messages</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</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 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 hvariable">div</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">[</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 string">"Echo Chat"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token hvariable">ul</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">(</span><span class="token hvariable">List.map</span> <span class="token punctuation">(</span><span class="token hvariable">msg</span> <span class="token operator">-></span> <span class="token hvariable">li</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">msg</span> <span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token hvariable">model</span><span class="token punctuation">.</span><span class="token hvariable">messages</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token hvariable">input</span> <span class="token punctuation">[</span> <span class="token hvariable">type_</span> <span class="token string">"text"</span> <span class="token punctuation">,</span> <span class="token hvariable">placeholder</span> <span class="token string">"Draft"</span> <span class="token punctuation">,</span> <span class="token hvariable">onInput</span> <span class="token constant">DraftChanged</span> <span class="token punctuation">,</span> <span class="token hvariable">on</span> <span class="token string">"keydown"</span> <span class="token punctuation">(</span><span class="token hvariable">ifIsEnter</span> <span class="token constant">Send</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token hvariable">value</span> <span class="token hvariable">model</span><span class="token punctuation">.</span><span class="token hvariable">draft</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token hvariable">button</span> <span class="token punctuation">[</span> <span class="token hvariable">onClick</span> <span class="token constant">Send</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token hvariable">text</span> <span class="token string">"Send"</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token hvariable">ifIsEnter</span> <span class="token operator">:</span> <span class="token hvariable">msg</span> <span class="token operator">-></span> <span class="token constant">D.Decoder</span> <span class="token hvariable">msg</span> <span class="token hvariable">ifIsEnter</span> <span class="token hvariable">msg</span> <span class="token operator">=</span> <span class="token keyword">let</span> <span class="token hvariable">getKey</span> <span class="token operator">=</span> <span class="token hvariable">D.field</span> <span class="token string">"key"</span> <span class="token hvariable">D.string</span> <span class="token hvariable">decodeKey</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token hvariable">key</span> <span class="token operator">-></span> <span class="token keyword">if</span> <span class="token hvariable">key</span> <span class="token operator">==</span> <span class="token string">"Enter"</span> <span class="token keyword">then</span> <span class="token hvariable">D.succeed</span> <span class="token hvariable">msg</span> <span class="token keyword">else</span> <span class="token hvariable">D.fail</span> <span class="token string">"some other key"</span><span class="token punctuation">)</span> <span class="token keyword">in</span> <span class="token hvariable">getKey</span> <span class="token operator">|></span> <span class="token hvariable">D.andThen</span> <span class="token hvariable">decodeKey</span> <span class="token keyword">type</span> <span class="token constant">Msg</span> <span class="token operator">=</span> <span class="token constant">DraftChanged</span> <span class="token constant">String</span> <span class="token operator">|</span> <span class="token constant">Send</span> <span class="token operator">|</span> <span class="token constant">Recv</span> <span class="token constant">String</span> <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">DraftChanged</span> <span class="token hvariable">draft</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">draft</span> <span class="token operator">=</span> <span class="token hvariable">draft</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">Send</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">draft</span> <span class="token operator">=</span> <span class="token string">""</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token hvariable">sendMessage</span> <span class="token hvariable">model</span><span class="token punctuation">.</span><span class="token hvariable">draft</span> <span class="token punctuation">)</span> <span class="token constant">Recv</span> <span class="token hvariable">message</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">messages</span> <span class="token operator">=</span> <span class="token hvariable">model</span><span class="token punctuation">.</span><span class="token hvariable">messages</span> <span class="token operator">++</span> <span class="token punctuation">[</span><span class="token hvariable">message</span><span class="token punctuation">]</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 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">messageReceiver</span> <span class="token constant">Recv</span> |
Như vậy là code ở view
chúng ta có khi người dùng nhấn phím Enter
hoặc nhấn vào nút gửi <form>
thì sẽ có một thông báo Send
được gửi tới trình update
. Lúc này update
sẽ sử dụng hàm sendMessage
để gửi dữ liệu và yêu cầu xử lý tới code JavaScript
bên ngoài.
Sau đó chúng ta có các subscriptions
được tạo ra để theo dõi sự kiện phản hồi từ code JavaScript
, và khi nhận thấy sự kiện thì sẽ có một tin nhắn Recv
kèm theo kết quả xử lý từ JavaScript
được gửi tới trình update
. Lúc này có thể một bản ghi model
mới sẽ được tạo ra và giao diện của trang web sẽ được thay đổi để đáp ứng với thao tác gửi <form>
.
Ở phía của JavaScript
, chúng ta cần sử dụng WebSocket
để tạo một mini server
trong môi trường trình duyệt web và định nghĩa một kênh gửi/nhận tương tác. Công cụ này được các trình duyệt web hỗ trợ bắt đầu từ Internet Explorer 10
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <span class="token doctype"><span class="token punctuation"><!</span><span class="token doctype-tag">doctype</span> <span class="token name">HTML</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> <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> Elm + WebSocket <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">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></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.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-spa<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>body</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">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token comment">// -- Create your WebSocket</span> <span class="token keyword">var</span> socket <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WebSocket</span><span class="token punctuation">(</span><span class="token string">'wss://echo.websocket.org'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// -- Init Elm SPA</span> <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-spa'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// -- Create channel "message" on socket</span> socket<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">"message"</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> app<span class="token punctuation">.</span>ports<span class="token punctuation">.</span>messageReceiver<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>event<span class="token punctuation">.</span>data<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 class="token comment">// -- Send request message from Elm SPA</span> app<span class="token punctuation">.</span>ports<span class="token punctuation">.</span>sendMessage<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> socket<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>message<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>html</span><span class="token punctuation">></span></span> |
Custom Elements
Một cách thức khác để thực hiện tương tác gửi/nhận 2 chiều với code JavaScript
đó là chúng ta có thể tự định nghĩa một class
mô tả phần tử HTML
với giao diện lập trình cần sử dụng, và sau đó tạo ra HTML node
bằng code Elm
để sử dụng giao diện lập trình vừa định nghĩa.
Ví dụ HTML5
cho phép chúng ta sử dụng các thẻ với tên tự đặt và có thể là <formatted-date>
. Tuy nhiên chúng ta cũng muốn rằng phần tử được tạo ra bởi thẻ này có một vài chức năng đặc biệt và quyết định tự định nghĩa một class
kế thừa của HTMLElement
. Và ở đây chúng ta có code ví dụ về một hàm định dạng thông tin localizeDate
được viết trong JavaScript
, sau đó được sử dụng trong giao diện lập trình của class
tự định nghĩa kế thừa HTMLElement
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <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 comment">// -- Extension for Elm</span> <span class="token keyword">function</span> <span class="token function">localizeDate</span> <span class="token punctuation">(</span><span class="token parameter">lang<span class="token punctuation">,</span> year<span class="token punctuation">,</span> month</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> dateTimeFormat <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Intl<span class="token punctuation">.</span>DateTimeFormat</span> <span class="token punctuation">(</span>lang<span class="token punctuation">,</span> <span class="token punctuation">{</span> weekday<span class="token operator">:</span> <span class="token string">'long'</span><span class="token punctuation">,</span> year<span class="token operator">:</span> <span class="token string">'numeric'</span><span class="token punctuation">,</span> month<span class="token operator">:</span> <span class="token string">'long'</span><span class="token punctuation">,</span> day<span class="token operator">:</span> <span class="token string">'numeric'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> dateTimeFormat<span class="token punctuation">.</span><span class="token function">format</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Date</span> <span class="token punctuation">(</span>year<span class="token punctuation">,</span> month<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// -- Define custom HTMLElement class</span> customElements<span class="token punctuation">.</span><span class="token function">define</span> <span class="token punctuation">(</span><span class="token string">'formatted-date'</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">extends</span> HTMLElement <span class="token punctuation">{</span> <span class="token comment">// -- things required by Custom Elements</span> <span class="token function">constructor</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">connectedCallback</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">setTextContent</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">attributeChangedCallback</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">setTextContent</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token keyword">get</span> <span class="token function">observedAttributes</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token string">'lang'</span><span class="token punctuation">,</span><span class="token string">'year'</span><span class="token punctuation">,</span><span class="token string">'month'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">setTextContent</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> lang <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getAttribute</span> <span class="token punctuation">(</span><span class="token string">'lang'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> year <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getAttribute</span> <span class="token punctuation">(</span><span class="token string">'year'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> month <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getAttribute</span> <span class="token punctuation">(</span><span class="token string">'month'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>textContent <span class="token operator">=</span> <span class="token function">localizeDate</span> <span class="token punctuation">(</span>lang<span class="token punctuation">,</span> year<span class="token punctuation">,</span> month<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// class</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// -- Init Elm SPA ...</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> |
Và trong code của Elm
thì chúng ta có thể sử dụng hàm khởi tạo node
để tạo phần tử HTML
với tên tự định nghĩa ở trên và như vậy phần tử này sẽ có tính năng hoạt động đặc biệt như mong muốn.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">module</span> <span class="token constant">Custom</span> <span class="token keyword">exposing</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 constant">Html</span><span class="token punctuation">,</span> <span class="token hvariable">node</span><span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html.Attributes</span> <span class="token punctuation">(</span><span class="token hvariable">attribute</span><span class="token punctuation">)</span> <span class="token hvariable">viewDate</span> <span class="token operator">:</span> <span class="token constant">String</span> <span class="token operator">-></span> <span class="token constant">Int</span> <span class="token operator">-></span> <span class="token constant">Int</span> <span class="token operator">-></span> <span class="token constant">Html</span> <span class="token hvariable">msg</span> <span class="token hvariable">viewDate</span> <span class="token hvariable">lang</span> <span class="token hvariable">year</span> <span class="token hvariable">month</span> <span class="token operator">=</span> <span class="token hvariable">node</span> <span class="token string">"formatted-date"</span> <span class="token punctuation">[</span> <span class="token hvariable">attribute</span> <span class="token string">"lang"</span> <span class="token hvariable">lang</span> <span class="token punctuation">,</span> <span class="token hvariable">attribute</span> <span class="token string">"year"</span> <span class="token punctuation">(</span><span class="token hvariable">String.fromInt</span> <span class="token hvariable">year</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token hvariable">attribute</span> <span class="token string">"month"</span> <span class="token punctuation">(</span><span class="token hvariable">String.fromInt</span> <span class="token hvariable">month</span><span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> |
Như vậy là chúng ta đã có đầy đủ các công cụ để bắt đầu xây dựng một SPA
với Elm
.