library main; // START:imports import 'dart:html'; import 'dart:convert'; // END:imports // START:main main() { var list_el = document.query('#comics-list'); var req = new HttpRequest(); req.open('get', '/comics'); req.onLoad.listen((req) { var list = JSON.decode(req.target.responseText); list_el.innerHtml = graphic_novels_template(list); }); req.send(); } // END:main // START:template graphic_novels_template(list) { var html = ''; list.forEach((graphic_novel) { html += graphic_novel_template(graphic_novel); }); return html; } graphic_novel_template(graphic_novel) { return '''
  • ${graphic_novel['title']} [delete]
  • '''; } // END:template /*** * This is not included in the book. * * Can use the following to handle deletes. Update the req.onLoad() handler * like the following to enable: * req.onLoad.listen((res) { * var list = JSON.decode(req.responseText); * list_el.innerHtml = graphic_novels_template(list); * }); * */ attach_delete_handlers(parent) { parent.queryAll('.delete').forEach((el) { el.onClick.listen((event) { delete(event.target.parent.id, callback:() { print("[delete] ${event.target.parent.id}"); event.target.parent.remove(); }); event.preventDefault(); }); }); } delete(id, {callback}) { var req = new HttpRequest(), default_callback = (){}; req.onLoad.listen((res) { (callback != null ? callback : default_callback)(); }); req.open('delete', '/comics/$id', async: true); req.send(); }