Drat! Thwarted temporarily in my efforts to get Dart to send Ajax requests with data in the request body, I set my sites a little to the side tonight. In particular, I would like to get simple listings of my comic book collection working.
The first thing I need is a REST-like listing resource for my
/comics. With express.js and node-dirty, that can be written as:var db = require('dirty')('comix.db');
// ...
app.get('/comics', function(req, res) {
var list = [];
db.forEach(function(id, graphic_novel) {
if (graphic_novel) list.push(graphic_novel);
});
res.send(JSON.stringify(list));
});I am going to populate the listing page almost entirely with Dart, so the initial view is breathtakingly simple:<script src="scripts/comics.dart" type="application/dart"></script> <h1>Dart Comics</h1> <p>Welcome to Dart Comics</p> <ul id="comics-list"></ul>As for my
comics.dart Dart code, I start with a small XHR to GET the /comics resource and print the results in the console:#import('dart:html');
main() {
var req = new XMLHttpRequest();
req.open('get', '/comics', true);
req.on.load.add((res) {
print(req.responseText);
});
req.send();
}I have to import the dart:html library to gain access to the XMLHttpRequest object, which is kinda important for Ajax. Sending the request is a simple matter of calling
open() with the appropriate HTTP verb and URL, and then instructing my XHR request to send() itself to the server. I pass in true as the third argument open to make this an asynchronous call so that this code will not block the browser while waiting on a response. Since this is an asynchronous call, I need an on-load callback to be fired after the request has been successfully loaded. For this, I make use of the nice
req.on.load.add syntax to add my callback that simply prints out the response.The result, after loading the page, is:
[
{"title":"Watchmen","author":"Alan Moore","id":"a1f9bcaa4e9939019ec9e4c36fa7a97e"},
{"title":"Watchmen","author":"Alan Moore","id":"12e5c6c33b16399f778bad86fc6bc082"}
]Whoops! Looks like I have duplicate entries. I will need to add validation code another day to prevent this situation. For now, I would like to list all of the returned entries along with a delete link.For this, I iterate through each of the returned comic books, building up an HTML string along the way:
#import('dart:html');
#import('dart:json');
main() {
var list_el = document.query('#comics-list')
, req = new XMLHttpRequest();
req.open('get', '/comics', true);
req.on.load.add((res) {
print(req.responseText);
var list = JSON.parse(req.responseText);
var html = '';
list.forEach((graphic_novel) {
html +=
"<li id='${graphic_novel['id']}'>" +
"${graphic_novel['title']}" +
" " +
"<a href='#'>[delete]</a>" +
"</li>";
});
req.send();
}
Which results in:Nice. It was fairly easy to connect my Dart application to a REST-like backend. The string interpolation with the dollar sign delimiter helps a bit with the HTML, but a template engine might still be nice. It is definitely nice to have first-level support for JSON (which I find a bit amusing considering that Javascript does not).
Satisfied with my progress so far, I will pick back up tomorrow adding event handlers to the delete links.
Day #269

This is great work Chris. You are blazing a trail that will make it easier for the rest of us when we get there. :)
ReplyDelete