On the other hand, there's frameworks like Backbone (and derivatives, like Marionette), which are much less opinionated; fewer decisions are made for you, giving you more flexibility to do what you wish, how you wish.
The trade-offs are that for the lower-level frameworks (like Backbone), you'll probably end up writing more code (both custom and boilerplate), and there'll be less magic happening within the blackbox that is the framework. Some like this, some don't, but ultimately it depends on the task at-hand and your own stylistic preferences.
I started with Ember.js building my app, but realized it exceeded the needs of the project and strongly imposed the design of the application. Since I had the time to invest up front, I switched to using non-opinionated libraries:
- Rivets.js for DOM data binding: http://rivetsjs.com/
- Director for URL routing: https://github.com/flatiron/director (also see Crossroads.js)
- Stapes.js for observable objects: http://hay.github.io/stapes/ (Stapes provided the foundation for my controllers and models)
I was able to borrow lots of design concepts I learned from Ember when re-implementing, and the total JS file size ended up being about half.
In their case it's move slow, stay broken. I like Batman.js but I feel like it's really falling into the shadow because of slow release cycles. PRs take 3 months to get accepted, and etc.
Embers take of ArrayController and ObjectController fits my iOS code design pattern with controllers for index/collection and controllers for member/detail.