JavaScript Interop

Tram Ho

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 sendMessagemessageReceiver ngay sau phần import.

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.

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.

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.

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.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo