I had a pleasant time messing about with DartBox2D for the past couple of days. I set that aside, for the time being, to investigate writing more typical web applications with Dart..
For the sake of argument, let us assume that I was a comic book nerd back in the day. If a certain tablet had suddenly spurred me to obtain some of my old-time favorites in digital format, I might like to have a simple application to keep track of where my various comics reside.
Eventually, I will see if I can figure out how to store this on the client, but for now, I stick with a server to store the data. The simplest way (that I know) to serve up HTML, Dart and a REST-like store is an express.js application server with a node-dirty store embedded.
I already have npm installed on my system as well as express.js installed globally. The upshot of this is that I can generate a new express.js app quickly:
➜ comix git:(master) ✗ express create : . create : ./package.json create : ./app.js create : ./public create : ./routes create : ./routes/index.js create : ./views create : ./views/layout.jade create : ./views/index.jade create : ./public/javascripts create : ./public/images create : ./public/stylesheets create : ./public/stylesheets/style.css dont forget to install dependencies: $ cd . && npm installI update the generated
package.json to include node-dirty (a simple, nosql backend store):{
"name": "comic-power"
, "version": "0.0.1"
, "private": true
, "dependencies": {
"express": "2.5.2"
, "jade": ">= 0.0.1"
, "dirty": "0.9.5"
, "dirty-uuid": ">= 0.0.1"
}
}With that, I can the use npm to install all of the dependencies for my application:➜ comix git:(master) ✗ npm install dirty-uuid@0.0.2 ./node_modules/dirty-uuid dirty@0.9.5 ./node_modules/dirty jade@0.20.0 ./node_modules/jade ├── mkdirp@0.2.2 └── commander@0.2.1 express@2.5.2 ./node_modules/express ├── mime@1.2.4 ├── qs@0.4.0 ├── mkdirp@0.0.7 └── connect@1.8.5I then proceed to create a simple form to collect comic book information:
To query the values of the form to submit to the backend, I do the usual dance of adding a reference to my Dart script and a kicker to get the scripting engine started:
<script>{}</script>
<script src="scripts/comic_put.dart" type="application/dart"></script>To query the form, I import "dart:html" and employ the query method to find and attach an event listener to the form element:#import('dart:html');
main() {
var form_el = document.query('#new-comic-form');
form_el.on.submit.add((event) {
var form = event.target
, title = form.query('input[name=title]')
, author = form.query('input[name=author]')
, format = form.queryAll('input[name=format]');
print("title: ${title.value}");
print("author: ${author.value}");
print(format);
event.preventDefault();
});
}This results in the following console output:I will worry about the checkboxes another day. For now, I would dearly love to submit that data to the backend. Unfortunately, the following:
var data = {'title':title.value, 'author':author.value};
print(JSON.stringify(data));
var req = new XMLHttpRequest();
req.open('post', '/comics', false);
req.send(JSON.stringify(data));
print(req.responseText);Ends up causing a not-implemented error:If I change the
req.send(JSON.stringify(data)) call to just req.send(), then the request is sent... only without the data that is the whole point.Thwarted for the moment, I call it an evening. I do very much like the
query() interface for finding elements and collections of elements. Event handlers in Dart are also nice and readable. Still, it would be nice if I could submit data via XHR. I will pick back up here tomorrow.Day #267



I'm wondering if this is a Dartium issue. You should try building from the DartEditor and loading into Chrome(non dartium build). BTW, I do have some samples that work with XMLHttpRequest and CouchDB
ReplyDeletehttp://goo.gl/DeH7A
http://goo.gl/uryqY
My biggest hangup was having some obscure error message when calling setRequestHeader() before calling open(). DOMException INVALID_STATE_ERR 11, is not a very friendly error message :)
Thanks! I definitely plan on using your work to (hopefully) get this working. I am not setting a request header like you, so I'll give that a shot. If that doesn't work, I'll try this from a local script and then fall back to frogc-ing the thing.
DeleteIt could be my version of Dartium, but it's a fairly recent build. If all else fails, I'll update/recompile.
http://src.chromium.org/viewvc/multivm/trunk/webkit/Source/WebCore/bindings/dart/custom/DartXMLHttpRequestCustom.cpp?revision=5&view=markup
ReplyDeleteAw, man!
DeleteThanks for pointing that out. Hopefully that'll get implemented soon.