# `Overview`

# What Is Angular?

AngularJS is a structural framework for dynamic web apps. It lets you use HTML as your template language and lets you extend HTML's syntax to express your application's components clearly and succinctly. Out of the box, it eliminates much of the code you currently write through data binding and dependency injection. And it all happens in JavaScript within the browser making it an ideal partner with any server technology.

Angular is what HTML would have been had it been designed for applications. HTML is a great declarative language for static documents. It does not contain much in the way of creating applications, and as a result building web applications is an exercise in what do I have to do, so that I trick the browser in to doing what I want.

The impedance mismatch between dynamic applications and static documents is often solved as:

- library - a collection of functions which are useful when writing web apps. Your code is in charge and it calls into the library when it sees fit. E.g., `jQuery` .
- frameworks - a particular implementation of a web application, where your code fills in the details. The framework is in charge and it calls into your code when it needs something app specific. E.g., `knockout` , `sproutcore` , etc.

Angular takes another approach. It attempts to minimize the impedance mismatch between document centric HTML and what an application needs by creating new HTML constructs. Angular teaches the browser new syntax through a construct we call directives. Examples include:

- Data binding as in `{{}}` .
- DOM control structures for repeating/hiding DOM fragments.
- Support for forms and form validation.
- Attaching code-behind to DOM elements.
- Grouping of HTML into reusable components.

## End-to-end solution

Angular tries to be an end-to-end solution, when building a web application. This means it is not a single piece in an overall puzzle of building a web application, but an end-to-end solution. This makes Angular opinionated about how a CRUD application should be built. But while it is opinionated, it also tries to make sure that its opinion is just a starting point, which you can easily change. Angular comes with the following out-of-the-box:

- Everything you need to build a CRUD app in a cohesive set: data-binding, basic templating directives, form validation, routing, deep-linking, reusable components, dependency injection.
- Testability story: unit-testing, end-to-end testing, mocks, test harnesses.
- Seed application with directory layout and test scripts as a starting point.

## Angular Sweet Spot

Angular simplifies application development by presenting a higher level of abstraction to the developer. Like any abstraction, it comes at a cost of flexibility. In other words not every app is a good fit for Angular. Angular was built for the CRUD application in mind. Luckily CRUD applications represent at least 90% of the web applications. But to understand what Angular is good at one also has to understand when an app is not a good fit for Angular.

Games, and GUI editors are examples of very intensive and tricky DOM manipulation. These kinds of apps are different from CRUD apps, and as a result are not a good fit for Angular. In these cases using something closer to bare metal such as `jQuery` may be a better fit.

# An Introductory Angular Example

Below is a typical CRUD application which contains a form. The form values are validated, and are used to compute the total, which is formatted to a particular locale. These are some common concepts which the application developer may face:

- attaching data-model to the UI.
- writing, reading and validating user input.
- computing new values based on the model.
- formatting output in a user specific locale.

### Source

### Demo

Try out the Live Preview above, and then let's walk through the example and describe what's going on.

In the `
` tag, we specify that it is an Angular application with the `ng-app` directive. The `ng-app` will cause Angular to auto initialize your application.

    <html ng-app>

We load Angular using the `
`