Ein wenig Gehirnschmalz musste ich in die Entscheidung stecken, ob ich einen ObjectController (erwartet ein Objekt als Modell) oder einen ArrayController (erwartet ein flaches Array als Datenstruktur) nehme. Da ich allerdings die Konzerte in einer Liste von Listen verwalte, habe ich mich schlussendlich für einen ObjectController entschieden.
Im Modell habe ich mich dafür entschieden Ember-Data zu verwenden. Es schien mir der “Ember-Way” zu sein: https://github.com/holgergp/concertEmber/blob/master/app/scripts/models/concertModel.js
Ember-Data fühlt sich viel restriktiver als ein simples JSON Modell an und ist wahrscheinlich für meinen Fall zu überdimensioniert. Allerdings ließen sich so auch schön Testdaten über FIXTURES anlegen und der Schritt zum Anbinden eines REST Service wäre nicht mehr groß.
In der Route habe ich dann das Modell und den Controller verbunden: https://github.com/holgergp/concertEmber/blob/master/app/scripts/routes/application_route.js
Ein größeres Problem hatte ich überraschenderweise beim Einfärben der Konzerte in Abhängigkeit der Fälligkeit.
Zur Erinnerung: Ich möchte gerne, dass das System mir auf einen Blick anzeigt, wie weit das Konzert in der Zukunft liegt, oder ob ich Dussel das Konzert schon wieder verpasst habe. Mit AngularJS habe ich einfach im Template über alle Konzerte iteriert (ng-repeat) und eine CSS-Klasse in Abhängigkeit des Datums gesetzt.
Ganz so einfach ist es mit EmberJS leider nicht.
Handlebars erlaubt es nicht (soweit ich es verstanden habe) Binding und parametrisiertem Methodenaufruf zu kombinieren mit z.B. einem weiteren Helper (wie z.B. in AngularJS https://github.com/holgergp/concertAngular/blob/master/app/views/main.html#L16).
Eine eigene Komponente hierfür zu schreiben fand ich zu umständlich. Ich habe dann zunächst eine eigene CollectionView geschrieben. Das klappte zwar, ich fand das aber nicht sehr elegant.
Nach 3 oder 4 Mal Hinschauen bin ich auf die Lösung einer Computed Property im Modell gestoßen. Das gefällt mir schon besser:
https://github.com/holgergp/concertEmber/blob/master/app/scripts/models/concertModel.js#L11-L45
Die Umsetzung des Drag-and-drop fand ich dann vergleichsweise einfach, indem ich auf die HTML5 Funktionalität zurückgegriffen habe. In Anlehnung an http://jsfiddle.net/ud3323/5uX9H/ habe ich dies als EmberView umgesetzt: https://github.com/holgergp/concertEmber/blob/master/app/scripts/views/dragAndDrop.js
Handlebars als Templating Lösung bietet an sich alles was man sich wünscht. Da Handlebars-Templates aber als Script Tags eingebunden werden, fand ich es an einigen Stellen vergleichsweise schwierig in den Browser-Dev-Tools nachzuvollziehen, ob sich Änderungen wie gewünscht ausgewirkt haben.
Die Tests liefen nach ein wenig Probieren auch, es war aber längerer Atem nötig verglichen mit AngularJS oder auch bei KnockoutJS.
https://github.com/holgergp/concertEmber/blob/master/test/spec/test.js
Wie man sieht, habe ich die Anwendung auch mit EmberJS umsetzen können, allerdings hat mich das vergleichsweise viel Aufwand gekostet und ich habe auch zu diesem Zeitpunkt noch nicht das Gefühl wirklich produktiv zu sein. Die Vielzahl an Konzepten hat mich zunächst eher überfordert (z.B. “Wann verwende ich eine View, wann eine Komponente?”)
Ich finde den Code und die Anwendungsstruktur auch weniger ansprechend als der entsprechende AngularJS Code. EmberJS setzt eher auf Vererbung als auf Komposition (siehe ObjectController). Vielleicht bin ich aber auch nur durch AngularJS versaut ?
Aber nichtsdestotrotz bietet EmberJS durch seine Strukturen natürlich eine ordentlich Basis für Single Page Applications.
Fazit
Mein Fazit für EmberJS und die Konzertanwendung. Ich verwende hier wie gehabt die Skala + (gut), 0 (ok), – (nicht so gut):
- Einarbeitung: –
- Die Tutorials auf der EmberJS Seite sind gut, allerdings hatte ich das Gefühl, dass man im Gegensatz zu AngularJS das Zusammenspiel der Konzepte schon viel früher genau kennen muss.
- Wartbarkeit: 0
- Der Entwickler muss alle Konzepte kennen. Verwendet man aber den Ember-Way, so wird ein EmberJS Entwickler wahrscheinlich nicht von einer bestehenden Anwendung überrascht.
- Lassen sich auch anspruchsvolle Anforderungen umsetzen: +
- Nimmt man Drag-and-drop als Indikator, so ist man mit EmberJS auch für anspruchsvolle Anforderungen gut gerüstet.
- Wie gut lässt sich die Anwendung testen? 0
- Wie oben schon erwähnt, lassen sich EmberJS Anwendung gut testen, es ist aber mehr Arbeit nötig, um die Testinfrastruktur aufzubauen.
- Wie groß ist die Community? 0
- Kleinere Community, aber ich habe zu allen Problemstellungen Antworten gefunden.
- Zum Vergleich, es gibt ca. 15.000 Einträge für EmberJS bei Stackoverflow, vs. 85.000 für AngularJS
- Wie gut ist die Dokumentation? 0
- Die Dokumentation ist recht umfangreich, aber recht dünn, wenn es etwas anspruchsvoller wird.