- Vaadin is highly dependent on http sessions and as it turns out doesn't play well when being clustered.
- No default support for server push; also the 'most stable' Vaadin add-on turned out to be quite unstable and incompatible with clustering.
- No wrapper existed for v3 of Google Maps; as an alternative we used the OpenLayers Add-on instead. However this add-on turned out to be not so stable either and lacked the user experience of Google Maps to which users are accustomed to (like dragging the 'pegman' on the map in order to show street view).
- The two way binding, it's just perfect; instead of fiddling around with jQuery expressions you simply attach a model value using a "ng-model" attribute on your HTML element. Any change made to the model value (i.e. as part of the logic of a controller) will instantly be reflected on your HTML element; and any change made by the user for this element will also be instantly updated to the model
- Unit testing is a first-class citizen. Not only does AngularJS allows easy testing RESTfull services by providing mocking for it, it also offers the $document, $window and $log features as mockable replacement of its global variables document, window and console.
- HTML and MVC controller logic can be get quite clean; a lot of display logic like disabling buttons and setting CSS classes can simply be implemented using expressions in HTML. Alternately widgets like the jQuery Datepicker can cleanly be integrated by creating a new HTML attribute for it (that triggers the set-up on an existing text input element) using a so-called "directive".
- Last but not least... it's really fun to work with