231 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			231 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | title: Angular 2 Starter Project | ||
|  | --- | ||
|  | This tutorial will build an extremely simple seed project with Angular2\. We will begin with the most basic application possible and then add on a bit more functionality. | ||
|  | 
 | ||
|  | ## Overview
 | ||
|  | 
 | ||
|  | Angular 2 applications are built by creating HTML templates that contain angular specific markup. Classes are then created to manage the templates and everything is wrapped into a module, which you piece together to create your application. These modules are referred to as **components**. | ||
|  | 
 | ||
|  | Angular interprets these modules and uses them to present your application in the browser. | ||
|  | 
 | ||
|  | ## Starter Application
 | ||
|  | 
 | ||
|  | Let's get started with a minimal application. We will begin with an application that contains a single module whose only job is to display some text. | ||
|  | 
 | ||
|  | We will begin by creating a new folder called "app".   | ||
|  | 
 | ||
|  |     $ mkdir app | ||
|  | 
 | ||
|  | As mentioned above, our application will begin with a single module, or **component**, that will display some text to the screen. We can use both pure JavaScript or TypeScript to make an angular 2 app. Using TypeScript, it is easier and more programmer friendly  | ||
|  | 
 | ||
|  | Let's learn how to create a component using TypeScript. | ||
|  | 
 | ||
|  | Create a file called _`app.component.ts`_ as shown:   | ||
|  | 
 | ||
|  |         // app.component.ts | ||
|  | 
 | ||
|  |         import { Component } from '@angular/core'; | ||
|  |         @Component({ | ||
|  |           selector: 'my-app', | ||
|  |           template: '<h1>Free Code Camp Rocks!</h1>', | ||
|  |           styles: <a href='http://plnkr.co/edit/BdvNONEmO3Jwg0EavX22' target='_blank' rel='nofollow'>` | ||
|  |             h1 { color: darkgreen; font-family: Arial, Helvetica, sans-serif;} | ||
|  |           `] | ||
|  |         }) | ||
|  |         export class AppComponent { } | ||
|  | 
 | ||
|  | Every Angular 2 application has at least one component which is usually named **AppComponent**. A component manages a portion of the page using the template within it. | ||
|  | 
 | ||
|  | Our component demonstrates the basic structure of any component you will ever write. It contains:   | ||
|  | * **import statements** to pull in other components we will need   | ||
|  | * **component decorator** which lets angular know which template to use and how the component will be created. Basically, any meta data related to the component.   | ||
|  | * **component class** which controls the component's appearance and behavior | ||
|  | 
 | ||
|  | Let's take a closer look at each line in our component. | ||
|  | 
 | ||
|  | ## Import
 | ||
|  | 
 | ||
|  |     import { Component } from '@angular/core'; | ||
|  | 
 | ||
|  | Since angular applications are modular, we can import any other modules or libraries we may need. Here, we are importing the Angular 2 core module to give our component access to the `@Component` decorator. Every app will need this import to get started. | ||
|  | 
 | ||
|  | Since we imported the `Component` function above, we can now use it to associate metadata with our component class that will tell Angular how our component should be created and the actions it will provide. | ||
|  | 
 | ||
|  | ## Component decorator
 | ||
|  | 
 | ||
|  |         @Component({ | ||
|  |           selector: 'my-app', | ||
|  |           template: '<h1>Free Code Camp Rocks!</h1>' | ||
|  |         }) | ||
|  |     ```     | ||
|  |     Our metadata object has selector and template fields. | ||
|  |     * The `selector` specifies a CSS selector that indicates which HTML element will represent this component. The element we will use will be named "`my-app`". Angular will use this to create an instance of our component where it finds this element. | ||
|  |     * The `template` tells angular what template it will use for this component. This can refer to other Components or just a form of HTML that tells how to display the view for our component. Our template is just displaying an `h1` element containing the text "`Free Code Camp Rocks!`". | ||
|  | 
 | ||
|  |     ## Component Class | ||
|  |     Our final line provides an empty class named ***AppComponent*** | ||
|  |     ```js | ||
|  |     export class AppComponent { } | ||
|  |     ``` | ||
|  |     If we want to build a more complex component we can add logic and properties to the class. This component is extremely basic and simply displays some html, so its class will remain empty. | ||
|  | 
 | ||
|  |     We export our class so we can use it in other components in our application. | ||
|  | 
 | ||
|  |     Next, we need to connect our root component to Angular. To do this we create another file in our app folder called *`main.ts`* that will have the following code: | ||
|  |     ```js | ||
|  |         import { bootstrap }    from '@angular/platform-browser-dynamic'; | ||
|  |         import { AppComponent } from './app.component'; | ||
|  |         bootstrap(AppComponent); | ||
|  |     ``` | ||
|  |     This file imports the two items we need to start our app. | ||
|  |     * **`bootstrap`** - Angular's built in method that connects to the browser  | ||
|  |     * **`AppComponent`** - Our component we created above (which is why we exported it) | ||
|  |     We then call `bootstrap` method with `AppComponent` | ||
|  | 
 | ||
|  |     **Finally, create index.html** | ||
|  | 
 | ||
|  |     ```html | ||
|  |         <html> | ||
|  |           <head> | ||
|  |             <title>Free Code Camp - Angular 2 Tutorial</title> | ||
|  |             <meta charset="UTF-8"> | ||
|  |             <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
|  |             <link rel="stylesheet" href="styles.css"> | ||
|  |             <!-- 1\. Load libraries --> | ||
|  |             <script src="https://npmcdn.com/core-js/client/shim.min.js"></script> | ||
|  | 
 | ||
|  |             <script src="https://npmcdn.com/zone.js@0.6.12?main=browser"></script> | ||
|  |             <script src="https://npmcdn.com/reflect-metadata@0.1.3"></script> | ||
|  |             <script src="https://npmcdn.com/systemjs@0.19.27/dist/system.src.js"></script> | ||
|  | 
 | ||
|  |             <!-- 2\. Configure SystemJS --> | ||
|  |             <script src="systemjs.config.js"></script> | ||
|  |             <script> | ||
|  |               System.import('app').catch(function(err){ console.error(err); }); | ||
|  |             </script> | ||
|  |           </head> | ||
|  | 
 | ||
|  |           <!-- Display app in my-app element --> | ||
|  |           <body> | ||
|  |             <my-app>Loading Your App...</my-app> | ||
|  |           </body> | ||
|  |         </html> | ||
|  |     ``` | ||
|  |     In commented section 1, we loaded several libraries that improve the compatibility of this tutorial with different browsers/versions. It also imports `system.src.js` which is used as module loader to import the app. | ||
|  | 
 | ||
|  |     In section 2, SystemJS is used to load our application and our various modules. In a production example we may want to use something else such as webpack. It was chosen here since we can use it with plunker. | ||
|  | 
 | ||
|  |     This is all that is required to get our simple application running. <a href="http://plnkr.co/edit/2i7Wjwd2JGj4NZtKvGD2" target="_blank">Here is a link to a plunker</a> that contains our working application. You can fork it into your own version and change whatever you'd like. | ||
|  | 
 | ||
|  |     <a target="_blank" href="http://plnkr.co/edit/2i7Wjwd2JGj4NZtKvGD2">VIEW APP</a> | ||
|  | 
 | ||
|  |     ## Add Functionality and Another Component | ||
|  | 
 | ||
|  |     Now let's add a bit more functionality to our program. We will create a counter that let's you increment it by clicking a button. | ||
|  | 
 | ||
|  |     Our increment component will be its own module so that we can reuse it in later applications.  | ||
|  | 
 | ||
|  |     Let's name our file: `app/increment-clicker.component.ts` and set it up. | ||
|  |     ```js | ||
|  |     // app/increment-clicker.component.ts | ||
|  |     import { Component } from '@angular/core';  | ||
|  | 
 | ||
|  |     @Component({ | ||
|  |         selector: 'increment-clicker', | ||
|  |         template: ` | ||
|  |           <div className="counter"> | ||
|  |             <h1>{{curClicks}} clicks</h1> | ||
|  |             <button type="button" (click)="incrementClicks()">Increment</button> | ||
|  |           </div> | ||
|  |         `, | ||
|  |         styles: [` | ||
|  |             .counter { | ||
|  |               width: 100%; | ||
|  |               margin: auto; | ||
|  |               background: darkgreen; | ||
|  |               border-radius: 5px; | ||
|  |               color: white; | ||
|  |               padding: 20px; | ||
|  |               text-align: center; | ||
|  |             } | ||
|  |             .counter h1 { | ||
|  |               margin: 0; | ||
|  |               padding: 20px; | ||
|  |               font-size: 36px; | ||
|  |             } | ||
|  |             .counter button { | ||
|  |               background: #f1c40f; | ||
|  |               border: 0; | ||
|  |               box-shadow: 0px 5px 0px #927608; | ||
|  |               padding: 20px; | ||
|  |               width: 100%; | ||
|  |               outline: none; | ||
|  |               border-radius: 5px; | ||
|  |               color: darkgreen; | ||
|  |               font-weight: bold; | ||
|  |             } | ||
|  | 
 | ||
|  |             .counter button:hover { | ||
|  |               background: #a9890a; | ||
|  |               cursor: pointer; | ||
|  |             } | ||
|  |         `] | ||
|  |     }) | ||
|  | 
 | ||
|  |     export class IncrementClicker { | ||
|  |       curClicks = 0; | ||
|  | 
 | ||
|  |       incrementClicks() { | ||
|  |         this.curClicks++; | ||
|  |       }   | ||
|  |     } | ||
|  |     ``` | ||
|  |     Our component structure is similar to our previous one, but we've added a bit of functionality here. You will notice our class is no longer empty. We've added a variable to track the clicks as well as a function to increment them when the user clicks the button. | ||
|  | 
 | ||
|  |     You can display properties from your class in your template using double braces such as: `{{ variableName }}` | ||
|  | 
 | ||
|  |     We bind the button click event to our class function using Angulars Event Bindings. | ||
|  |     ```html | ||
|  |     <button type="button" (click)="incrementClicks()">Increment</button> | ||
|  |     ``` | ||
|  | 
 | ||
|  |     Notice that we've also added some styling to our components. This way everything is self-contained in this module. You may also include a `templateUrl` and/or `styleUrls` properties instead to extract the template and style rules to an external file and link them here. | ||
|  | 
 | ||
|  |     Now we just need to update our `AppComponent` to include our new component: | ||
|  |     ```js | ||
|  |     // app/app.component.ts | ||
|  | 
 | ||
|  |     import { Component } from '@angular/core'; | ||
|  | 
 | ||
|  |     /* Nested Component */ | ||
|  |     import { IncrementClicker } from 'app/increment-clicker.component'; | ||
|  | 
 | ||
|  |     @Component({ | ||
|  |       selector: 'my-app', | ||
|  |       directives: [IncrementClicker], | ||
|  |       template: ` | ||
|  |         <h1>Free Code Camp Rocks!</h1> | ||
|  |         <increment-clicker></increment-clicker> | ||
|  |       `, | ||
|  |       styles: [` | ||
|  |         h1 { color: darkgreen; font-family: Arial, Helvetica, sans-serif;} | ||
|  |       `]   | ||
|  |     }) | ||
|  | 
 | ||
|  |     export class AppComponent { } | ||
|  |     ``` | ||
|  |     To pull in our new `IncrementClicker` component we need to import it by including the class name as well as the location of the typescript file as we did on this line: | ||
|  |     ```js | ||
|  |     import { IncrementClicker } from 'app/increment-clicker.component'; | ||
|  |     ``` | ||
|  |     We then add the `IncrementClicker` *component* as a directive to the `AppComponent` module using: | ||
|  |     ```js | ||
|  |     directives: [IncrementClicker], | ||
|  | 
 | ||
|  | Finally, we just add the tag that our component connects to in the template. So the selector in our `IncrementClicker` component will match the tag where we want it to show up.   | ||
|  | `js   | ||
|  | template: ` <h1>Free Code Camp Rocks!</h1> <increment-clicker></increment-clicker> `,`    | ||
|  | Our component is now included in our app!   | ||
|  | [Updated Code</a>   | ||
|  | <a href='http://run.plnkr.co/plunks/BdvNONEmO3Jwg0EavX22/' target='_blank' rel='nofollow'>VIEW COMPLETE APPLICATION</a> |