Make a simple App
Using Angular 2 ? X
Requirements
- Node installation (node 6.9.0 or higher https://nodejs.org/)
 - Browser (ex: Chrome)
 - IDE (ex : Atom, intelliJ, VSCode...etc)
 
Configurations
install angular cli
#npm install -g @angular/cliMore info here : https://github.com/angular/angular-cli
create a new project
#ng new simple-appbuild it
#ng buildrun it
#ng servego to the app directory
#cd simple-appOpen your browser at :
 http://localhost:4200
Exploring
Angular Boiler plate
DEMO
Make our first component
create a new component
#ng generate component articlecreate src/app/article/article.component.html (26 bytes)
create src/app/article/article.component.spec.ts (635 bytes)
create src/app/article/article.component.ts (273 bytes)
create src/app/article/article.component.css (0 bytes)
update src/app/app.module.ts (402 bytes)
result :
check it all
- *.component.html => template
 - *.component.css => style
 - *.component.spec.ts => test file
 - *.component.ts => logic file
 - app.module.ts => register our component
 
article
import { Component, OnInit } from '@angular/core';
@Component({
  selector: 'app-article',
  templateUrl: './article.component.html',
  styleUrls: ['./article.component.css']
})
export class ArticleComponent implements OnInit {
    
  readonly title: string;
  readonly content: string;
  constructor(){
    this.title = 'First Article';
    this.content = 'Hello World';
  }
  ngOnInit(): void {
  }
}
an article should have a title and a content
add this to your article.component.ts
<div>
    <h3> {{this.title}} </h3>
    <p> {{this.content}} </p>
</div>add something inside your article.component.html
call it in the app.component.html (clean it before)
<app-article></app-article>Do not need to rebuild !
It refresh automatically
try to add an authors to article...
add some css !
Component Input
Let's create a new component
that will display all articles
#ng generate component articles1 - Call it in app.component.html instead of app-article
2 - Add a call of app-article inside articles.component.html
change fields to input parameters in article.component.ts
1 - in article change title and content field
    @Input()
    title : string;
    @Input("customContent")
    content : string;(remove initalization inside constructor)
2 - now app-article take two input parameters
<app-article [title]="'MyTitle'" [customContent]="'MyContent'"></app-article>add a new field in articles component
article = {title: 'My First Article', content : 'Hello World'};use it in articles.component.html
<app-article [title]="this.article.title" [customContent]="this.article.content"></app-article>- Change parameter to an article object
 - Try to add other article
 - In articles we should have a list of articles...
 
Tricks :
- create an Article interface or class
 - *ngFor
 
Make our first service
git clone https://github.com/Amirault/angular5-articles-app.git 
git reset --hard 8f525c70354dee5509bd480f7bbccc218263ced3
cd angular5-articles-app
npm installBackup
Create a new service
#ng generate service articleNow we have
import { Injectable } from '@angular/core';
@Injectable()
export class ArticleService {
  constructor() { }
}
Article service should give all Articles
create a new method inside article.service.ts
public getArticles() : Article[] {
    return [{
      title: 'My First Article',
      content: 'Hello World',
      author: 'Orangefire'
    }, {
      title: 'Angular component',
      content: 'Angular component looks awesome!',
      author: 'Orangefire'
    }, {
      title: 'Angular service',
      content: 'I read something about angular service, i will try it soon',
      author: 'Orangefire'
    }];
} Now we can use it to retrieve all articles from our "Articles" component
constructor(private articleService: ArticleService) {
}Then inject it in articles.component.ts constructor
Finally call it to get all articles ! (use it in html)
articles(): Article[] {
    return this.articleService.getArticles();
}  providers: [ArticleService]First register it to app.module.ts
Backup
git reset --hard 0b050a6d9d01f198a3732bb747997520cda4dffeConnect it to real world
npm install -g json-serverinstall json-server ( our backend server )
create your database in a file named db.json
{
"articles" : [{
      "title": "My First Article",
      "content": "Hello World",
      "author": "Orangefire"
    }, {
      "title": "Angular component",
      "content": "Angular component looks awesome!",
      "author": "Orangefire"
    }, {
      "title": "Angular service",
      "content": "I read something about angular service, i will try it soon",
      "author": "Orangefire"
    }]
}
Start it
json-server --watch db.jsonhttps://github.com/typicode/json-server
add HttpClient in order to make http request
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import {HttpClientModule} from '@angular/common/http';
import { AppComponent } from './app.component';
import { ArticleComponent } from './article/article.component';
import { ArticlesComponent } from './articles/articles.component';
import {ArticleService} from "./services/article.service";
@NgModule({
  declarations: [
    AppComponent,
    ArticleComponent,
    ArticlesComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  providers: [ArticleService],
  bootstrap: [AppComponent]
})
export class AppModule { }
HTTPClient
Calling our backend with httpClient
in Article.service.ts
in article.service.ts import HttpClient and Observable
constructor(private http : HttpClient) {
}import {HttpClient} from "@angular/common/http";
import {Observable} from "rxjs/Observable";inject HttpClient
make a call to get our Articles from our backend
  public getArticles(): Observable<Article[]> {
    return this.http.get<Article[]>("http://localhost:3000/articles");
  }We are providing a reactive stream on Articles !
Subscribing in our articles component
- 
	
Register our obervable on ngOnInit
 - 
	
provide an observable to the view (html)
 
export class ArticlesComponent implements OnInit {
  articles: Observable<Article[]>;
  constructor(private articleService: ArticleService) {
  }
  ngOnInit() {
    this.articles = this.articleService.getArticles();
  }
}use "| async" (async pipe) to subscribe on the view
<app-article *ngFor="let article of this.articles() | async" [article]="article">
</app-article>Test It !
- Remove | async and use the providing ".subscribe()" method
 - Add an "id" field to Article
 - Implement delete service wich permit to remove an Article
Tricks : - DELETE /articles/{id}
 - Use "(click)" event
 
Component
Output
git reset --hard 27e273f1d8cae3c9f05ac0eb445dfcae68756981Backup
An article can be deleted
provide a delete button on article
<button (click)="delete()"></button>then create the associated function of click event
On click the article component
should push a delete notification
EventEmitter
Create an output field in our article.component
@Output()
deletedArticle : EventEmitter<Article> = new EventEmitter();delete(){
    this.deletedArticle.emit(this.article);
}when the delete button is clicked then emit the deletedArticle
Now our component exposes an event
<app-article  [article]="article" (deletedArticle)="delete($event)"></app-article>we can subscribe to the event
delete($event) will be executed on (deletedArticle) event
On articles.component.html
use the new event
implement delete fonction in articles.component.ts
prototype : delete(article : article)
Make a Form
git reset --hard b3ff04ba037a2912b1879c3e5d73b188d5867390Backup
create a new component
$ng generate component article-creationImport reactive form in app.module
import { ReactiveFormsModule } from '@angular/forms';imports: [
    BrowserModule,
    HttpClientModule,
    ReactiveFormsModule 
  ],Create a form
in article-create.component.ts initialize form
  articleForm : FormGroup;
  constructor(private fb: FormBuilder) {
    this.articleForm = this.fb.group({
      title: ['Fake Title', Validators.required ],
      content : ['', Validators.required ],
      authors : ['', Validators.required ],
    });
  }import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms';
Create a form
in article-create.component.html make your form
<h2>Article</h2>
<h3><i>Create your article</i></h3>
<form [formGroup]="articleForm" (ngSubmit)="createArticle()">
  <div class="form-group">
    <label class="center-block">title:
      <input class="form-control" formControlName="title">
    </label>
    <br />
    <label class="center-block">content:
      <textarea class="form-control" formControlName="content"></textarea>
    </label>
    <br />
    <label class="center-block">authors:
      <input class="form-control" formControlName="authors">
    </label>
    <br />
    <button class="btn btn-success" [disabled]="articleForm.invalid" type="submit">Save</button>
  </div>
</form>
Submit new article
- Use (ngSubmit) to recieve input data
 - Create the new article into our database
 - Refresh articles list ...
 
const { title, content, authors } = this.articleForm.value;
const newArticle = {
  title,
  content,
  authors
}unwrapping formGroup, example :
Service, HTTP POST, no id, EventEmitter ?
Tricks :
Navigation / ROUTE
git reset --hard 36f30626172039325429121711dfc09a0c0dab6dBackup
App component
Articles
component
Article Creation 
Component 
/
Currently
App component
Articles
component
Article Creation 
Component 
/create
/articles
/
With Routing
Default
Configurations
import { RouterModule, Routes } from '@angular/router';imports: [
    RouterModule.forRoot(
      appRoutes,
      { enableTracing: true } // <-- debugging purposes only
    ),
    BrowserModule,
    HttpClientModule,
    ReactiveFormsModule
  ],In our app.module
Enable Routing
const appRoutes: Routes = [
  { path: 'create', component: ArticleCreationComponent },
  { path: 'articles', component: ArticlesComponent },
  { path: '', component: ArticlesComponent }
]in our app.module configure each route
- 
	
when calling /create show ArticleCreationComponent
 - 
	
when calling /articles show ArticlesComponent
 - 
	
when calling / show Articles Component
 
in app.component.html replace all by
<router-outlet></router-outlet>it enable routing on app component
Enable Routing
Test it !
Use routerLink
provide routing to "/create"
<a routerLink="/create" >New Article</a>- 
	
Use a nav-bar
 - 
	
We should navigate to articles component
 - Bonus : Dynamic route
	
- On articles component, when clicking on article name go to the corresponding article using routing (only the corresponding article must be showed).
 
 
Angular.io Doc
#5 courses-angular-simple-app
By orangefire
#5 courses-angular-simple-app
- 656