Ich muss zugeben, dass ich AngularJS im Vorfeld meiner Recherchen schon privat und beruflich eingesetzt habe, von daher ist ein Vergleich nicht ganz fair und ich bin vielleicht etwas voreingenommen ? Die mit AngularJS umgesetzte Konzertanwendung (siehe Teil 1) soll demnach als eine Art “Golden Master” fungieren, um die grundsätzliche Machbarkeit zu zeigen. Um es vorwegzunehmen, ich mag AngularJS recht gerne, habe auch in meinem Blog ein wenig über die guten und schlechten Seiten geschrieben.
Die Konzepte
Die Kernidee von AngularJS ist es, das Vokabular von HTML so zu erweitern, dass dynamische Webanwendungen damit elegant umsetzbar sind. Soweit der Claim auf angularjs.org. Angular ermöglicht es auch dieses Vokabular eigenhändig zu erweitern, so dass beispielsweise ein <guitar />-Tag denkbar wäre, was der Lesbarkeit der Anwendung zu Gute kommt. Richtig trivial ist dies allerdings nicht.
Vorweg gesagt: Wenn man die Arbeit mit JQuery kennt, muss man sich ein wenig umgewöhnen, man kommt selten bis nie mit dem DOM in Berührung und AngularJS bringt viele eigene Ideen mit und arbeitet generell auf einem höheren Abstraktionsniveau.
AngularJS ist ein clientseitiges MVC Framework, wobei die Entwickler sich bewusst aus dem Begriffswirrwarr rund um MVC vs. MVP vs. MVVM etc. rausgehalten haben und ihren Ansatz als Model View Whatever (MVW) bezeichnen.
Nehmen wir doch einmal die Bestandteile von Angular anhand dieses Patterns auseinander:
Als View-Technik setzt Angular auf einen an JSP erinnernden Templatemechanismus, der clientseitig interpretiert wird. In diesen Templates werden Daten (also eigentlich das ViewModel) nach dem Muster referenziert. Angular verwendet hierfür einen 2-Wege-Databinding-Mechanismus, wobei auf (View-)Mode Seite ein einfaches Plain-Old-JavaScript-Object verwendet wird.
Siehe hierzu auch: https://github.com/holgergp/concertAngular/blob/master/app/views/main.html.
Zu einer View gehören immer ein oder mehrere Controller (ja, eigentlich das ViewModel). Dieser enthält die View-spezifische Logik und die zu bindenden Daten. Diese werden deklarativ (u.a.) im Template referenziert. (https://github.com/holgergp/concertAngular/blob/master/app/index.html#L36)
<div ng-include="'views/main.html'" ng-controller="MainCtrl"></div>
Beachtenswert ist, dass MainCtrl
eine einfache JavaScript Funktion ist.
Die zu bindenden Daten und Funktionen sind nach einem bestimmten Schema zu notieren, damit die View auf diese zugreifen kann: Sie werden dem sogenannten Scope zugeordnet, der einem Controller zugeordnet ist und das logische Bindeglied zwischen View und Controller darstellt. Siehe hierzu auch https://github.com/holgergp/concertAngular/blob/master/app/views/main.html#L9
Hier referenzieren wir die loveConcerts
, die unter dem Scope hinzugefügt wurden.
Controller und die zugehörigen Scopes können auch geschachtelt werden: