What is AngularJS
Angular is a JavaScript Model - View - View Model (MVVM) Framework
Falls in the family of other MVVM frameworks - KnockoutJS and KendoUI
Used for making Single Page Applications (SPA Applications)
Complete Client Side Solution - But can also be used on the server side in a MEAN (Mongo-Express-Angular-Node) Stack
MVC/MV-P/MV-VM/MV-WTF
All modern JavaScript frameworks fall under some kind of Model-View-Controller (or their combination) framework. These frameworks do the regular stuff and help us in working on the problem on hand. They also help in avoiding spaghetti code.
Models - represent domain-specific knowledge and data in an application
Views - the UI in an application (eg. your markup and templates). They should know the existence of your model in order to observe them, but not communicate with them
Controllers - handle inputs (clicks, user actions etc) in an applications. Based on the input, the controller updates the state of a model, but does not communicate this directly to the View. The View observes the model for any updates.
All of this helps in separating concerns within our web application
Model-View-ViewModel
(MVVM)
In a MVC framework, the View has access to the complete model, which can cause performance and security issues.
MVVM allows use to create view-specific formatted subsets of the model, which can contain the logic and the state, thereby avoid exposing the entire model to the views.
This provides security and performance to a web-app
But it also increases complexity. Thats when a good framework comes to the rescue!
Angular is built around the belief that declarative code is better than imperative code when it comes to building UIs and writing software components together, while imperative code is excellent for business logic
The Zen of Angular
It is a very good idea to decouple DOM manipulation from app logic. This dramatically improves the testability of the code
It is a really, really good idea to regard app testing as equal importance to app writing. Testing difficulty is dramatically affected by the way the code is structured
It is an excellent idea to decouple the client side of an app from the server side. This allows development work to progress in parallel, and allows for reuse of both sides
It is very helpful indeed if the framework guides developers through the entire journey of building an app: from designing the UI, through writing the business logic, to testing
It is always good to make common tasks trivial and difficult tasks possible