-
Notifications
You must be signed in to change notification settings - Fork 27.4k
docs(tutorial): update to use v1.5.x
and best practices
#14416
Changes from all commits
5050dd5
2944392
2549951
26d3abe
b555f2c
d7be60f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,130 +7,143 @@ | |
|
||
|
||
In this step of the tutorial, you will become familiar with the most important source code files of | ||
the AngularJS phonecat app. You will also learn how to start the development servers bundled with | ||
angular-seed, and run the application in the browser. | ||
the AngularJS Phonecat App. You will also learn how to start the development servers bundled with | ||
[angular-seed][angular-seed], and run the application in the browser. | ||
|
||
Before you continue, make sure you have set up your development environment and installed all necessary | ||
dependencies, as described in {@link index#get-started Get Started}. | ||
Before you continue, make sure you have set up your development environment and installed all | ||
necessary dependencies, as described in the {@link tutorial/#environment-setup Environment Setup} | ||
section. | ||
|
||
In the `angular-phonecat` directory, run this command: | ||
|
||
``` | ||
git checkout -f step-0 | ||
``` | ||
|
||
|
||
This resets your workspace to step 0 of the tutorial app. | ||
|
||
You must repeat this for every future step in the tutorial and change the number to the number of | ||
the step you are on. This will cause any changes you made within your working directory to be lost. | ||
|
||
If you haven't already done so you need to install the dependencies by running: | ||
If you haven't already done so, you need to install the dependencies by running: | ||
|
||
``` | ||
npm install | ||
``` | ||
|
||
To see the app running in a browser, open a *separate* terminal/command line tab or window, then | ||
run `npm start` to start the web server. Now, open a browser window for the app and navigate to | ||
<a href="http://localhost:8000/app/" target="_blank" title="Open app on localhost">`http://localhost:8000/app/`</a> | ||
To see the app running in a browser, open a _separate_ terminal/command line tab or window, then run | ||
`npm start` to start the web server. Now, open a browser window for the app and navigate to | ||
http://localhost:8000/index.html. | ||
|
||
Note that if you already ran the master branch app prior to checking out step-0, you may see the cached | ||
master version of the app in your browser window at this point. Just hit refresh to re-load the page. | ||
Note that if you already ran the master branch app prior to checking out step-0, you may see the | ||
cached master version of the app in your browser window at this point. Just hit refresh to re-load | ||
the page. | ||
|
||
You can now see the page in your browser. It's not very exciting, but that's OK. | ||
|
||
The HTML page that displays "Nothing here yet!" was constructed with the HTML code shown below. | ||
The code contains some key Angular elements that we will need as we progress. | ||
|
||
__`app/index.html`:__ | ||
**`app/index.html`:** | ||
|
||
```html | ||
<!doctype html> | ||
<html lang="en" ng-app> | ||
<head> | ||
<meta charset="utf-8"> | ||
<title>My HTML File</title> | ||
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css"> | ||
<link rel="stylesheet" href="css/app.css"> | ||
<script src="bower_components/angular/angular.js"></script> | ||
</head> | ||
<body> | ||
|
||
<p>Nothing here {{'yet' + '!'}}</p> | ||
|
||
</body> | ||
<head> | ||
<meta charset="utf-8"> | ||
<title>My HTML File</title> | ||
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css" /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I'm fine removing it, if you feel strongly about it. |
||
<script src="bower_components/angular/angular.js"></script> | ||
</head> | ||
<body> | ||
|
||
<p>Nothing here {{'yet' + '!'}}</p> | ||
|
||
</body> | ||
</html> | ||
``` | ||
|
||
|
||
|
||
## What is the code doing? | ||
|
||
**`ng-app` directive:** | ||
<br /> | ||
**`ng-app` attribute:** | ||
|
||
<html ng-app> | ||
```html | ||
<html ng-app> | ||
``` | ||
|
||
The `ng-app` attribute represents an Angular directive, named `ngApp` (Angular uses `kebab-case` for | ||
its custom attributes and `camelCase` for the corresponding directives which implement them). This | ||
directive is used to flag the HTML element that Angular should consider to be the root element of | ||
our application. This gives application developers the freedom to tell Angular if the entire HTML | ||
page or only a portion of it should be treated as the AngularJS application. | ||
|
||
The `ng-app` attribute represents an Angular directive named `ngApp` (Angular uses | ||
`spinal-case` for its custom attributes and `camelCase` for the corresponding directives | ||
which implement them). | ||
This directive is used to flag the html element that Angular should consider to be the root element | ||
of our application. | ||
This gives application developers the freedom to tell Angular if the entire html page or only a | ||
portion of it should be treated as the Angular application. | ||
For more info on `ngApp`, check out the {@link ngApp API Reference}. | ||
|
||
**AngularJS script tag:** | ||
<br /> | ||
**`angular.js` script tag:** | ||
|
||
<script src="bower_components/angular/angular.js"> | ||
```html | ||
<script src="bower_components/angular/angular.js"></script> | ||
``` | ||
|
||
This code downloads the `angular.js` script which registers a callback that will be executed by the | ||
This code downloads the `angular.js` script which registers a callback that will be executed by the | ||
browser when the containing HTML page is fully downloaded. When the callback is executed, Angular | ||
looks for the {@link ng.directive:ngApp ngApp} directive. If | ||
Angular finds the directive, it will bootstrap the application with the root of the application DOM | ||
being the element on which the `ngApp` directive was defined. | ||
looks for the {@link ngApp ngApp} directive. If Angular finds the directive, it will bootstrap the | ||
application with the root of the application DOM being the element on which the `ngApp` directive | ||
was defined. | ||
|
||
For more info on bootstrapping your app, checkout the [Bootstrap](guide/bootstrap) section of the | ||
Developer Guide. | ||
|
||
<br /> | ||
**Double-curly binding with an expression:** | ||
|
||
Nothing here {{'yet' + '!'}} | ||
```html | ||
Nothing here {{'yet' + '!'}} | ||
``` | ||
|
||
This line demonstrates two core features of Angular's templating capabilities: | ||
|
||
* a binding, denoted by double-curlies `{{ }}` | ||
* a simple expression `'yet' + '!'` used in this binding. | ||
* A binding, denoted by double-curlies: `{{ }}` | ||
* A simple expression used in this binding: `'yet' + '!'` | ||
|
||
The binding tells Angular that it should evaluate an expression and insert the result into the | ||
DOM in place of the binding. Rather than a one-time insert, as we'll see in the next steps, a | ||
binding will result in efficient continuous updates whenever the result of the expression | ||
evaluation changes. | ||
The binding tells Angular that it should evaluate an expression and insert the result into the DOM | ||
in place of the binding. As we will see in the next steps, rather than a one-time insert, a binding | ||
will result in efficient continuous updates whenever the result of the expression evaluation | ||
changes. | ||
|
||
{@link guide/expression Angular expression} is a JavaScript-like code snippet that is | ||
evaluated by Angular in the context of the current model scope, rather than within the scope of | ||
the global context (`window`). | ||
{@link guide/expression Angular expressions} are JavaScript-like code snippets that are evaluated by | ||
Angular in the context of the current model scope, rather than within the scope of the global | ||
context (`window`). | ||
|
||
As expected, once this template is processed by Angular, the html page contains the text: | ||
"Nothing here yet!". | ||
As expected, once this template is processed by Angular, the HTML page contains the text: | ||
|
||
## Bootstrapping AngularJS apps | ||
``` | ||
Nothing here yet! | ||
``` | ||
|
||
Bootstrapping AngularJS apps automatically using the `ngApp` directive is very easy and suitable | ||
for most cases. In advanced cases, such as when using script loaders, you can use the | ||
{@link guide/bootstrap imperative / manual way} to bootstrap the app. | ||
## Bootstrapping Angular Applications | ||
|
||
There are 3 important things that happen during the app bootstrap: | ||
Bootstrapping Angular applications automatically using the `ngApp` directive is very easy and | ||
suitable for most cases. In advanced cases, such as when using script loaders, you can use the | ||
{@link guide/bootstrap#manual-initialization imperative/manual way} to bootstrap the application. | ||
|
||
There are 3 important things that happen during the bootstrap phase: | ||
|
||
1. The {@link auto.$injector injector} that will be used for dependency injection is created. | ||
|
||
2. The injector will then create the {@link ng.$rootScope root scope} that will | ||
become the context for the model of our application. | ||
2. The injector will then create the {@link ng.$rootScope root scope} that will become the context | ||
for the model of our application. | ||
|
||
3. Angular will then "compile" the DOM starting at the `ngApp` root element, processing any | ||
directives and bindings found along the way. | ||
|
||
|
||
Once an application is bootstrapped, it will then wait for incoming browser events (such as mouse | ||
click, key press or incoming HTTP response) that might change the model. Once such an event occurs, | ||
Angular detects if it caused any model changes and if changes are found, Angular will reflect them | ||
in the view by updating all of the affected bindings. | ||
clicks, key presses or incoming HTTP responses) that might change the model. Once such an event | ||
occurs, Angular detects if it caused any model changes and if changes are found, Angular will | ||
reflect them in the view by updating all of the affected bindings. | ||
|
||
The structure of our application is currently very simple. The template contains just one directive | ||
and one static binding, and our model is empty. That will soon change! | ||
|
@@ -140,27 +153,29 @@ and one static binding, and our model is empty. That will soon change! | |
|
||
## What are all these files in my working directory? | ||
|
||
|
||
Most of the files in your working directory come from the [angular-seed project][angular-seed] which | ||
is typically used to bootstrap new Angular projects. The seed project is pre-configured to install | ||
the angular framework (via `bower` into the `app/bower_components/` folder) and tools for developing | ||
a typical web app (via `npm`). | ||
Most of the files in your working directory come from the [angular-seed project][angular-seed], | ||
which is typically used to bootstrap new AngularJS projects. The seed project is pre-configured to | ||
install the AngularJS framework (via `bower` into the `app/bower_components/` directory) and tools | ||
for developing and testing a typical web application (via `npm`). | ||
|
||
For the purposes of this tutorial, we modified the angular-seed with the following changes: | ||
|
||
* Removed the example app | ||
* Added phone images to `app/img/phones/` | ||
* Added phone data files (JSON) to `app/phones/` | ||
* Removed the example app. | ||
* Removed unused dependencies. | ||
* Added phone images to `app/img/phones/`. | ||
* Added phone data files (JSON) to `app/phones/`. | ||
* Added a dependency on [Bootstrap](http://getbootstrap.com) in the `bower.json` file. | ||
|
||
|
||
|
||
# Experiments | ||
|
||
* Try adding a new expression to the `index.html` that will do some math: | ||
<div></div> | ||
|
||
<p>1 + 2 = {{ 1 + 2 }}</p> | ||
* Try adding a new expression to `index.html` that will do some math: | ||
|
||
```html | ||
<p>1 + 2 = {{1 + 2}}</p> | ||
``` | ||
|
||
|
||
# Summary | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,11 +12,11 @@ dynamically display the same result with any set of data. | |
|
||
In this step you will add some basic information about two cell phones to an HTML page. | ||
|
||
- The page now contains a list with information about two phones. | ||
* The page now contains a list with information about two phones. | ||
|
||
<div doc-tutorial-reset="1"></div> | ||
|
||
|
||
<br /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above. |
||
**`app/index.html`:** | ||
|
||
```html | ||
|
@@ -39,15 +39,19 @@ In this step you will add some basic information about two cell phones to an HTM | |
|
||
# Experiments | ||
|
||
<div></div> | ||
|
||
* Try adding more static HTML to `index.html`. For example: | ||
|
||
<p>Total number of phones: 2</p> | ||
```html | ||
<p>Total number of phones: 2</p> | ||
``` | ||
|
||
|
||
# Summary | ||
|
||
This addition to your app uses static HTML to display the list. Now, let's go to {@link step_02 | ||
step 2} to learn how to use AngularJS to dynamically generate the same list. | ||
This addition to your app uses static HTML to display the list. Now, let's go to | ||
{@link step_02 step 2} to learn how to use Angular to dynamically generate the same list. | ||
|
||
|
||
<ul doc-tutorial-nav="1"></ul> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we consider using
lite-server
instead ofhttp-server
since it has a couple of nice features like automatic rewriting to index.html (to support HTML5 mode) and also it starts up the browser when you start the server.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The version of
http-server
we are using now also supports opening the browser.Since we are not using HTML5 mode in the tutorial (I would rather keep it that way, in order to avoid discussing one more concept (server-side configuration for HTML5 mode)), I don't think
lite-server
offers any advantage overhttp-server
. We could switch, but we need to also updateangular-phonecat
andangular-seed
, so I would avoid it if there is no compelling reason.How about we do it in a subsequent PR ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK stick with
http-server
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Although lite-server also offers live-reloading :-)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have already added this to my post-merge tasks :)