In this tutorial I am not going to discuss more about Angular concepts, I already discussed that in the below links. To understand this demo better, first of all, please go through the below links before proceeding further.
I will demonstrate a few features of Angular 2 and above versions with a small demo application. Here is the below content which I am going to cover as part of this demo application:
- Create an angular application by following quick start
 
- Create a component ‘nav.component’ with application title and navigation links.
 
- Navigation Links
 
- Users
 
- Todos
 
- Albums
 
- The navigation menu should be available on every page and corresponding menu items should be highlighted when you visit a route.
 
- Create a component named ‘user.list.component’ which shows information about users.
 
- On clicking a ‘user’ item it should redirect to a new route (user/userid) which shows all the information about the user
 
- User posts
 
- User albums
 
- User to-do’s
Each of the above posts, albums and todos are individual components which retrieve required information based on userids from respective services. 
- Demonstrate *ngFor directive with li’s/tr’s
 
- Demonstrate ngClass, ngModel
 
- Demonstrate interpolation and two-way binding
 
- Demonstrate *ngIf. Show ‘No Data’ message there is data is available.
 
- Create a component named ‘post.list.component’ which shows user posts when a userid parameter is sent.
 
- Create a component named ‘album.list.component’ which shows a user album when a userid parameter is sent. If a parameter is not available show all albums.
 
- Create a component named ‘todo.list.component’ which shows the user to do when a parameter is sent if a parameter is not available to show all albums
 
- All services should follow these rules
 
- Demonstrate rxjs observables
 
- Error handling
 
- Dependency Injection (Inject the service where ever required)
 
- Create a component named ‘search.component’ which helps a user to perform search operations
 
- It should have input[type=text], ‘search’ button and ‘clear’ button.
 
- On clicking ‘search’, component should emit an event with search criteria to parent component
 
- Use search component in the user list and album list components.
 
- Search component label should change to ‘user’ or ‘album’ based on the type of parent component.
 
- Create a directive ‘highlight.directive.ts’ which should highlight (the color of the text should change to ‘red’) all the users who have ‘LLC’ in the company name.
 
- Demonstrate form validation with angular by creating a new user registration page.
 
- A new button on ‘user.list.component’ should navigate to a new route (user/new)
 
- Create a user, address classes and bind them to create a registration page.
 
- A form should have following fields. Submit event should take the user object and log into the console.
 
- FirstName*
 
- LastName*
 
- MiddleName
 
- Email*
 
- Street*
 
- Country*
 
- City*
 
- Integrate a third-party module into your application and demonstrate it (the third party can be anything)
 
Ex: ng2-bootstrap, PrimeNG for Angular2, Material designs for Angular2 (I like this)
- The template layouts (HTML design) is up to your creativity.
 
- Organize your code in the following folder structure
![Angular]()
 
Note
- Make sure your import statements are written well. All packages are case-sensitive.
 
- Make sure all your CSS/less/sass files are component specific.
 
- In case of wrong imports, compilation may work fine sometimes but module loading will fail.
 
- Verify that you are running node v4.x.x or higher and npm 3.x.x or higher
 
Please do have a clear understanding of the below files,
Source code for point number #2
nav.component.html
- <!-- Static navbar -->  
 
- <nav class="navbar navbar-default">  
 
-   <div class="container">  
 
-     <div class="navbar-header">  
 
-       <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">  
 
-         <span class="sr-only">Toggle navigation</span>  
 
-         <span class="icon-bar"></span>  
 
-         <span class="icon-bar"></span>  
 
-         <span class="icon-bar"></span>  
 
-       </button>  
 
-       <a class="navbar-brand" href="#">Anguar2 Sample</a>  
 
-     </div>  
 
-     <div id="navbar" class="navbar-collapse collapse">  
 
-       <ul class="nav navbar-nav">  
 
-         <li [routerLinkActive]="['active']" class="active"><a routerLink="/users" href="#">Users</a></li>  
 
-         <li [routerLinkActive]="['active']"><a routerLink="/todos" href="# ">Todos</a></li>  
 
-         <li [routerLinkActive]="['active']"><a routerLink="/albums" href="# ">Albums</a></li>  
 
-       </ul>  
 
-     </div>  
 
-     <!--/.nav-collapse -->  
 
-   </div>  
 
-   <!--/.container-fluid -->  
 
- </nav>  
 
 
nav.component.ts
- import { Component, OnInit } from '@angular/core';  
 
-   
 
-   
 
- @Component({  
 
-   moduleId: module.id,  
 
-   selector: 'navmenu',  
 
-   templateUrl: 'nav.component.html'  
 
- })  
 
- export class NavComponent implements OnInit {  
 
-   constructor() { }  
 
-   ngOnInit() {  }  
 
- }  
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
- import { AppComponent } from './app.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
-   
 
- @NgModule({  
 
-   imports: [NgbModule.forRoot(), BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [NavComponent, AppComponent],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { } 
 
 
app.component.ts
- import { Component } from '@angular/core';  
 
- @Component({  
 
-   selector: 'my-app',  
 
-   template: `<navmenu></navmenu>  
 
-     <router-outlet></router-outlet>  
 
-     `  
 
- })  
 
- export class AppComponent {  
 
-   ChildEvent(event: any) {  
 
-     console.log(event);  
 
-   }  
 
- }  
 
 
Output
![Angular]()
Source code for point number #3
user.list.component.css
- ul {  
 
-   list-style-type: none;  
 
-   margin: 0;  
 
-   padding: 0;  
 
- }  
 
-   
 
- ul.cards>li {  
 
-   padding: 5px;  
 
-   cursor: pointer;  
 
-   margin: 10px;  
 
-   width: 200px;  
 
-   height: 300px;  
 
-   vertical-align: top;  
 
-   border: 1px solid #ccc;  
 
-   box-shadow: 10px 10px 5px #CCC;  
 
-   display: inline-block;  
 
- }  
 
-   
 
- ul.cards>li:hover {  
 
-   border: 1px solid deepskyblue;  
 
-   box-shadow: 15px 15px 5px #CCC;  
 
- }  
 
-   
 
- section.users {  
 
-   padding: 5px;  
 
- } 
 
 
user.list.component.html
- <div class="container">  
 
-   <div class="row">  
 
-     <div class="col-md-7">  
 
-       <search-component (goClicked)="searchTriggered($event)" (clearClicked)="clearTriggered($event)"></search-component>  
 
-     </div>  
 
-     <div class="col-md-3">  
 
-       <div class="btn-group pull-right">  
 
-         <button type="button" class="btn" [ngClass]="!isDetailsView ? 'btn btn-success' : 'btn'" (click)="toggle(false)">List</button>  
 
-         <button type="button" class="btn" [ngClass]="isDetailsView ? 'btn btn-success' : 'btn'" (click)="toggle(true)">Detail</button>  
 
-       </div>  
 
-     </div>  
 
-     <div class="col-md-2">  
 
-       <a routerLink="/users/new" href="#" class="btn btn-success">New</a>  
 
-     </div>  
 
-   </div>  
 
-   <div class="row">  
 
-     <div class="col-md-12">  
 
-       <section class="users">  
 
-         <table class="table table-bordered table-hover" *ngIf="!isDetailsView">  
 
-           <thead>  
 
-           <tr>  
 
-             <td><strong>Name</strong></td>  
 
-             <td><strong>Email</strong></td>  
 
-             <td><strong>Phone</strong></td>  
 
-             <td><strong>Website</strong></td>  
 
-           </tr>  
 
-           </thead>  
 
-           <tbody>  
 
-           <tr *ngFor="let usr of filteredData">  
 
-             <td>{{usr.name}}</td>  
 
-             <td>{{usr.email}}</td>  
 
-             <td>{{usr.phone | uppercase}}</td>  
 
-             <td>  
 
-               <a target="_blank" href="http://{{usr.website}}">{{usr.website}}</a>  
 
-             </td>  
 
-           </tr>  
 
-           </tbody>  
 
-           <tbody *ngIf="filteredData.length === 0">  
 
-           <tr>  
 
-             <td colspan="4">  
 
-               <h1>No Data!</h1>  
 
-             </td>  
 
-           </tr>  
 
-           </tbody>  
 
-         </table>  
 
-       </section>  
 
-     </div>  
 
-   </div>  
 
-   <div class="row">  
 
-     <div class="col-md-12">  
 
-       <section class="users" *ngIf="isDetailsView">  
 
-         <ul class="cards">  
 
-           <li *ngFor="let usr of filteredData" (click)="showUser(usr)" hover highlight>  
 
-             <p><strong>{{usr.name}}</strong></p>  
 
-             <em><a target="_blank" href="http://{{usr.website}}">{{usr.website}}</a></em>  
 
-             <p>Street: {{usr.address?.street}}</p>  
 
-             <p>suite: {{usr.address?.suite}}</p>  
 
-             <p>city: {{usr.address?.city}}</p>  
 
-             <p>zipcode: {{usr.address?.zipcode}}</p>  
 
-             <em><a target="_blank" href="http://{{usr.website}}">{{usr.website}}</a></em>  
 
-           </li>  
 
-         </ul>  
 
-       </section>  
 
-     </div>  
 
-   </div>  
 
- </div> 
 
 
user.list.component.ts
- import {  
 
-   Component, Input,  
 
-   OnInit  
 
- } from '@angular/core';  
 
- import { UserService } from '../../services/user.service';  
 
-   
 
- import { Router } from '@angular/router';  
 
-   
 
- @Component({  
 
-   selector: 'user-list',  
 
-   templateUrl: 'app/components/user/user.list.component.html',  
 
-   styleUrls: ['app/components/user/user.list.component.css']  
 
- })  
 
- export class UserListComponent implements OnInit {  
 
-   @Input('userdata') users: any[] = [];  
 
-     
 
-   searchFilter: string = '';  
 
-   isDetailsView: boolean = true;  
 
-   filteredData: any[];  
 
-   
 
-   constructor(private _userService: UserService, private _router: Router) {  
 
-     console.log('I am constructor!');  
 
-   }  
 
-   
 
-   toggle(isDetailsView: any) {  
 
-     console.log(isDetailsView);  
 
-     this.isDetailsView = isDetailsView;  
 
-   }  
 
-   
 
-   ngOnInit() {  
 
-     this._userService.getUsers().subscribe((users) => {  
 
-       this.filteredData = this.users = users;  
 
-     }, error => {  
 
-       console.error('Error in UserList', error);  
 
-     });  
 
-   }  
 
-   
 
-   
 
-    
 
-  
 
-  
 
-  
 
-  
 
-  
 
-  
 
-  
 
-  
 
-  
 
-  
 
-  
 
-   
 
-   
 
-   clear() {  
 
-     this.searchFilter = '';  
 
-     this.filteredData = this.users;  
 
-   }  
 
-   
 
-   showUser(user: any) {  
 
-     this._router.navigate(['/user', user.id]);  
 
-   }  
 
-   
 
-   clearTriggered(){  
 
-   
 
-     this.filteredData = this.users;  
 
-   }  
 
-   
 
-   searchTriggered(data: any) {  
 
-     console.log('user list search button click event');  
 
-     this.filteredData = this.users.filter((item) => {  
 
-       return item.name.toLowerCase().indexOf(data.searchText.toLowerCase()) > -1;  
 
-     });  
 
-   }  
 
- } 
 
 
user.component.ts
- import { Component, OnInit } from '@angular/core';  
 
- import { ActivatedRoute } from '@angular/router';  
 
- import { UserService } from '../../services/user.service';  
 
-   
 
- @Component({  
 
-   moduleId: module.id,  
 
-   selector: 'user',  
 
-   providers: [UserService],  
 
-   template: `  
 
-     <a routerLink="/users">Back to Users</a>  
 
- <hr>  
 
-     <ul class="cards">  
 
-         <li>  
 
-             <p><strong>{{usr.name}}</strong></p>  
 
-             <p>Street: {{usr.address?.street}}</p>  
 
-             <p>suite: {{usr.address?.suite}}</p>  
 
-             <p>city: {{usr.address?.city}}</p>  
 
-             <p>zipcode: {{usr.address?.zipcode}}</p>  
 
-             <em><a target="_blank" href="http://{{usr.website}}">{{usr.website}}</a></em>  
 
-         </li>  
 
-     </ul>  
 
-     `  
 
- })  
 
- export class UserComponent implements OnInit {  
 
-   usr: any = {};  
 
-   constructor(private aroute: ActivatedRoute,  
 
-               private _userService: UserService) { }  
 
-   
 
-   ngOnInit() {  
 
-     this.aroute.params.subscribe((params) => {  
 
-       let userId = params['id'];  
 
-       this._userService.getUser(userId).subscribe((user) => {  
 
-         this.usr = user;  
 
-       });  
 
-     });  
 
-   }  
 
- } 
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
-   
 
- import { AppComponent } from './app.component';  
 
- import { UserListComponent} from './components/user/user.list.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
- import { SearchComponent } from './components/filter/search.component';  
 
- import { APP_ROUTES } from './app.routes';  
 
- import { UserComponent } from './components/user/user.component';  
 
- import { UserService } from './services/user.service';  
 
-   
 
-   
 
- @NgModule({  
 
-   imports: [BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [SearchComponent, NavComponent, AppComponent, UserListComponent, UserComponent  
 
- ],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { }  
 
 
Output
![Angular]()
When we click on Users then by default it is the Detail, output as below,
![Angular]()
If we click on List view then below is the output,
![Angular]()
Source code for point number #4
post.list.component.ts
- import { Component } from '@angular/core';  
 
- import { UserService } from '../../services/user.service';  
 
-   
 
- @Component({  
 
-   selector: 'post-list',  
 
-   template: `Yet to..`  
 
- })  
 
- export class PostListComponent {  
 
-   constructor(private _userService: UserService) {}  
 
-   
 
-   ngOnInit() {  
 
-     this._userService.getUsers()  
 
-       .subscribe((data) => {  
 
-         console.log(data);  
 
-       });  
 
-   }  
 
- } 
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
-   
 
- import { AppComponent } from './app.component';  
 
- import { UserListComponent} from './components/user/user.list.component';  
 
- import { NewUserComponent } from './components/user/new.user.component'  
 
- import { TodoComponent } from './components/todo/todo.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
- import { PostListComponent } from './components/posts/post.list.component';  
 
- import { UserService } from './services/user.service';  
 
- import { SearchComponent } from './components/filter/search.component';  
 
- import { APP_ROUTES } from './app.routes';  
 
- import { NgbdModalBasic } from './components/user/modal-basic';  
 
-   
 
- @NgModule({  
 
-   imports: [BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [SearchComponent, NavComponent, AppComponent, UserListComponent, PostListComponent],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { } 
 
 
Source code for point number #5
album.list.component.html
- <div class="container">  
 
-   <div class="row">  
 
-     <search-component (goClicked)="searchTriggered($event)" (clearClicked)="clearTriggered($event)"></search-component>  
 
-   </div>  
 
-   <div class="row">  
 
-     <div *ngFor="let album of albumlist">  
 
-       <div class="alert">  
 
-         <strong>{{album.userId}}</strong> {{album.title}}  
 
-       </div>  
 
-     </div>  
 
-   </div>  
 
- </div>  
 
 
album.list.component.ts
- import { Component, Input } from '@angular/core';  
 
- import { AlbumService } from '../../services/album.service';  
 
-   
 
- import { ActivatedRoute } from '@angular/router';  
 
-   
 
- @Component({  
 
-   moduleId: module.id,  
 
-   selector: 'album-list',  
 
-   templateUrl: 'album.list.component.html',  
 
-   providers: [AlbumService]  
 
- })  
 
- export class AlbumListComponent {  
 
-   @Input('albumlist') _albumlist: any[] = [];  
 
-   albumlist: any[];  
 
-   constructor(private _albumService: AlbumService,  
 
-               private aroute: ActivatedRoute) {  
 
-   
 
-   }  
 
-   
 
-   ngOnInit() {  
 
-     this.aroute.params.subscribe((data) => {  
 
-       let userid = data['id'];  
 
-       console.log(userid);  
 
-       if (userid) {  
 
-         this._albumService.getAlbumByUserId(userid).subscribe((data) => {  
 
-           this.albumlist = data;  
 
-           console.log(data);  
 
-         });  
 
-       } else {  
 
-         this._albumService.getAlbums().subscribe((data) => {  
 
-           this.albumlist = this._albumlist = data;  
 
-         });  
 
-       }  
 
-   
 
-     });  
 
-   }  
 
-   clearTriggered() {  
 
-     this.albumlist = this._albumlist;  
 
-   }  
 
-   searchTriggered(data: any) {  
 
-     console.log('album list search button click event');  
 
-     this.albumlist = this.albumlist.filter((item) => {  
 
-       return item.title.toLowerCase().indexOf(data.searchText.toLowerCase()) > -1;  
 
-     });  
 
-   }  
 
- } 
 
 
album.service.ts
- import { Injectable } from '@angular/core';  
 
- import { Http } from '@angular/http';  
 
- import 'rxjs/add/operator/map';  
 
-   
 
- @Injectable()  
 
- export class AlbumService {  
 
-   url: string = 'https://jsonplaceholder.typicode.com/';  
 
-   constructor(private _http: Http) { }  
 
-   
 
-   getAlbums() {  
 
-     let albumUrl = this.url + 'albums';  
 
-     return this._http.get(albumUrl)  
 
-       .map((res) => { return res.json(); });  
 
-   }  
 
-   
 
-   getAlbumByUserId(id: number) {  
 
-     let albumUrl = `${this.url}albums`;  
 
-     return this._http.get(albumUrl + '?userId=' + id)  
 
-       .map((res) => { return res.json(); });  
 
-   }  
 
- } 
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
- import { AppComponent } from './app.component';  
 
- import { UserListComponent} from './components/user/user.list.component';  
 
- import { TodoComponent } from './components/todo/todo.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
- import { PostListComponent } from './components/posts/post.list.component';  
 
- import { UserService } from './services/user.service';  
 
- import { AlbumListComponent } from './components/albums/album.list.component';  
 
- import { SearchComponent } from './components/filter/search.component';  
 
- import { APP_ROUTES } from './app.routes';  
 
- import { NgbdModalBasic } from './components/user/modal-basic';  
 
-   
 
- @NgModule({  
 
-   imports: [BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [SearchComponent, AlbumListComponent, TodoComponent, NavComponent, AppComponent, UserListComponent, PostListComponent],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { }  
 
 
Output
![Angular]()
Source code for point number #6
todo.component.html
- <div class="container">  
 
-   <div class="row">  
 
-     <div *ngFor="let todo of todos">  
 
-       <div class="alert">  
 
-         <strong>{{todo.userId}}</strong> {{todo.title}}  
 
-       </div>  
 
-     </div>  
 
-   </div>  
 
- </div> 
 
 
todo.component.ts
- import { Component, OnInit } from '@angular/core';  
 
- import { TodoService } from '../../services/todo.service';  
 
- import { ActivatedRoute } from '@angular/router';  
 
-   
 
- @Component({  
 
-   moduleId: module.id,  
 
-   selector: 'todo',  
 
-   templateUrl: 'todo.component.html',  
 
-   providers: [TodoService]  
 
- })  
 
- export class TodoComponent implements OnInit {  
 
-   todos: any[];  
 
-   constructor(private _todoService: TodoService,  
 
-               private aroute: ActivatedRoute) {  
 
-   
 
-   }  
 
-   
 
-   ngOnInit() {  
 
-     this.aroute.params.subscribe((data) => {  
 
-       let userid = data['id'];  
 
-       console.log(userid);  
 
-       if (userid) {  
 
-         this._todoService.getTodosByUserId(userid).subscribe((data) => {  
 
-           this.todos = data;  
 
-           console.log(data);  
 
-         });  
 
-       } else {  
 
-         this._todoService.getTodos().subscribe((data) => {  
 
-           this.todos = data;  
 
-         });  
 
-       }  
 
-   
 
-     });  
 
-   
 
-   }  
 
- } 
 
 
todo.service.ts
- import { Injectable } from '@angular/core';  
 
- import { Http } from '@angular/http';  
 
- import 'rxjs/add/operator/map';  
 
-   
 
- @Injectable()  
 
- export class TodoService {  
 
-   url: string = 'https://jsonplaceholder.typicode.com/';  
 
-   constructor(private _http: Http) { }  
 
-   
 
-   getTodos() {  
 
-     let todoUrl = this.url + 'todos';   
 
-     return this._http.get(todoUrl)  
 
-       .map((res) => { return res.json(); });  
 
-   }  
 
-   
 
-   getTodosByUserId(id: number) {  
 
-     let todoUrl = `${this.url}todos`;  
 
-     return this._http.get(todoUrl + '?userId=' + id)  
 
-       .map((res) => { return res.json(); });  
 
-   }  
 
- } 
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
- import { AppComponent } from './app.component';  
 
- import { UserListComponent} from './components/user/user.list.component';  
 
- import { NewUserComponent } from './components/user/new.user.component'  
 
- import { TodoComponent } from './components/todo/todo.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
- import { PostListComponent } from './components/posts/post.list.component';  
 
- import { UserService } from './services/user.service';  
 
- import { AlbumListComponent } from './components/albums/album.list.component';  
 
- import { SearchComponent } from './components/filter/search.component';  
 
- import { APP_ROUTES } from './app.routes';  
 
- import { NgbdModalBasic } from './components/user/modal-basic';  
 
-   
 
- @NgModule({  
 
-   imports: [BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [SearchComponent, AlbumListComponent, TodoComponent, NavComponent, AppComponent, UserListComponent, PostListComponent],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { }  
 
 
Output
![Angular]()
Source code for point number #7
If you observe point number #5 and #6, I am loading Album and Todos list details using service call and injecting the service class to a component class constructor using dependency injection mechanism.
Source code for point number #8
search.component.html
- <div class="col-md-8">  
 
-   <div class="input-group">  
 
-     <input type="text" class="form-control" placeholder="Name" [(ngModel)]="searchFilter">  
 
-     <div class="input-group-btn">  
 
-       <button class="btn btn-success" type="button" (click)="searchUsers()">Go</button>  
 
-     </div>  
 
-     <div class="input-group-btn">  
 
-       <button class="btn btn-default" type="button" (click)="clear()">Clear</button>  
 
-     </div>  
 
-   </div>  
 
- </div> 
 
 
search.component.ts
- import {  
 
-   Component, Input, Output,  
 
-   OnInit, EventEmitter  
 
- } from '@angular/core';  
 
-   
 
- import { AlbumListComponent } from '../albums/album.list.component';  
 
- import { UserListComponent } from '../user/user.list.component';  
 
-   
 
- @Component({  
 
-   selector: 'search-component',  
 
-   templateUrl: 'app/components/filter/search.component.html',  
 
- })  
 
- export class SearchComponent implements OnInit {  
 
-   searchFilter: String;  
 
-   @Input('searchInput') searchInput: string = '';  
 
-   @Output() goClicked: EventEmitter<any> = new EventEmitter<any>();  
 
-   @Output() clearClicked: EventEmitter<any> = new EventEmitter<any>();  
 
-   
 
-   constructor() {  
 
-       
 
-     console.log('I am constructor!');  
 
-   }  
 
-   
 
-   ngOnInit() {  
 
-   }  
 
-   
 
-   searchUsers() {  
 
-     console.log('searchUsers');  
 
-     this.goClicked.emit({  
 
-       searchText: this.searchFilter  
 
-     });  
 
-   }  
 
-   clear() {  
 
-     this.searchFilter = '';  
 
-     this.clearClicked.emit({  
 
-     });  
 
-   }  
 
- } 
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
-   
 
- import { AppComponent } from './app.component';  
 
- import { UserListComponent} from './components/user/user.list.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
- import { SearchComponent } from './components/filter/search.component';  
 
- import { APP_ROUTES } from './app.routes';  
 
- import { NgbdModalBasic } from './components/user/modal-basic';  
 
-   
 
- @NgModule({  
 
-   imports: [BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [SearchComponent, NavComponent, AppComponent, UserListComponent],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { } 
 
 
Output
![Angular]()
Source code for point number #9
highlight.directive.ts
- import {  
 
-   Directive, ElementRef,  
 
-   Renderer, Input  
 
- } from '@angular/core';  
 
-   
 
- @Directive({  
 
-   selector: '[highlight]'  
 
- })  
 
- export class HighlightDirective {  
 
-   userData: any = {};  
 
-   
 
-   constructor(private _eleRef: ElementRef,  
 
-               private _renderer: Renderer) {  
 
-   }  
 
-   
 
-   @Input()  
 
-   set hover(obj: any) {  
 
-     this.userData = obj;  
 
-   }  
 
-   
 
-    
 
-  
 
-   
 
-   ngAfterViewInit() {  
 
-     if ((this._eleRef.nativeElement.innerText.indexOf('.org') > 0) === true) {  
 
-       this._eleRef.nativeElement.style.color = 'red';  
 
-     }  
 
-   }  
 
- } 
 
 
hover.directive.ts
- import {  
 
-   Directive, ElementRef,  
 
-   HostListener, Renderer, Input  
 
- } from '@angular/core';  
 
-   
 
- @Directive({  
 
-   selector: '[hover]'  
 
- })  
 
- export class HoverDirective {  
 
-   userData: any = {};  
 
-   
 
-   constructor(private _eleRef: ElementRef,  
 
-               private _renderer: Renderer) {  
 
-   }  
 
-   
 
-   @Input() set hover(obj: any) {  
 
-     this.userData = obj;  
 
-   }  
 
-   
 
-   ngOnInit() {  
 
-       
 
-       
 
-     this._eleRef.nativeElement.onclick = (event: Event) => {  
 
-       alert(JSON.stringify(this.userData));  
 
-     }  
 
-   }  
 
-   
 
-   @HostListener('mouseenter') onMouseEnter() {  
 
-     console.log('mouseenter', this._eleRef.nativeElement);  
 
-     this._eleRef.nativeElement.style.color = 'red';  
 
-       
 
-   }  
 
-   
 
-   @HostListener('mouseleave') onMouseLeave() {  
 
-     console.log('mouseleave', this._eleRef.nativeElement);  
 
-     this._eleRef.nativeElement.style.color = '';  
 
-     if ((this._eleRef.nativeElement.innerText.indexOf('.org') > 0) === true) {  
 
-       this._eleRef.nativeElement.style.color = 'red';  
 
-     }  
 
-   }  
 
- }  
 
 
user.list.component.html
- <div class="col-md-12">  
 
-   <section class="users" *ngIf="isDetailsView">  
 
-     <ul class="cards">  
 
-       <li *ngFor="let usr of filteredData" (click)="showUser(usr)" hover highlight>  
 
-         <p><strong>{{usr.name}}</strong></p>  
 
-         <em><a target="_blank" href="http://{{usr.website}}">{{usr.website}}</a></em>  
 
-         <p>Street: {{usr.address?.street}}</p>  
 
-         <p>suite: {{usr.address?.suite}}</p>  
 
-         <p>city: {{usr.address?.city}}</p>  
 
-         <p>zipcode: {{usr.address?.zipcode}}</p>  
 
-         <em><a target="_blank" href="http://{{usr.website}}">{{usr.website}}</a></em>  
 
-       </li>  
 
-     </ul>  
 
-   </section>  
 
- </div>  
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
- import { AppComponent } from './app.component';  
 
- import { UserListComponent} from './components/user/user.list.component';  
 
- import { NewUserComponent } from './components/user/new.user.component'  
 
- import { TodoComponent } from './components/todo/todo.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
- import { PostListComponent } from './components/posts/post.list.component';  
 
- import { UserService } from './services/user.service';  
 
- import { HoverDirective } from './directives/hover.directive';  
 
- import { HighlightDirective } from './directives/highlight.directive';  
 
- import { UserComponent } from './components/user/user.component';  
 
- import { AlbumListComponent } from './components/albums/album.list.component';  
 
- import { SearchComponent } from './components/filter/search.component';  
 
- import { APP_ROUTES } from './app.routes';  
 
-   
 
- @NgModule({  
 
-   imports: [BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [SearchComponent, AlbumListComponent, NgbdModalBasic, NewUserComponent, TodoComponent, NavComponent, AppComponent, UserListComponent, PostListComponent, HoverDirective, HighlightDirective],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { } 
 
 
Output
![Angular]()
Source code for point number #10
new.user.component.html
- <div class="container">  
 
-   <div class="row">  
 
-     <form role="form" (ngSubmit)="submit($event)">  
 
-       <legend>New User</legend>  
 
-       <div class="form-group">  
 
-         <label for="fname">First Name</label>  
 
-         <input type="text" name="fname" required value="" class="form-control" [(ngModel)]="user.firstName">  
 
-       </div>  
 
-       <div class="form-group">  
 
-         <label for="mname">Middle Name</label>  
 
-         <input type="text" name="mname" value="" class="form-control" [(ngModel)]="user.middleName">  
 
-       </div>  
 
-   
 
-       <div class="form-group">  
 
-         <label for="lname">Last Name</label>  
 
-         <input type="text" name="lname" value="" required class="form-control" [(ngModel)]="user.lastName">  
 
-       </div>  
 
-       <div class="form-group">  
 
-         <label for="email">Email</label>  
 
-         <input type="email" name="email" value="" required class="form-control" [(ngModel)]="user.email">  
 
-       </div>  
 
-   
 
-       <div class="form-group">  
 
-         <label>Country</label>  
 
-         <select name="country" class="form-control" [(ngModel)]="user.country" required>  
 
-           <option [value]="0">Select</option>  
 
-           <option *ngFor="let c of countries" [value]="c.code">{{c.name}}</option>  
 
-         </select>  
 
-       </div>  
 
-       <button type="submit" class="btn btn-success">Submit</button>  
 
-       <span>{{user | json}}</span>  
 
-     </form>  
 
-   </div>  
 
-   <ngbd-modal-basic></ngbd-modal-basic>  
 
- </div>  
 
 
new.user.component.ts
- import { Component, OnInit } from '@angular/core';  
 
- import { COUNTRIES } from './country';  
 
-   
 
- @Component({  
 
-   moduleId: module.id,  
 
-   selector: 'new-user',  
 
-   templateUrl: 'new.user.component.html',  
 
-   styles: [`input.ng-invalid.ng-touched {  
 
-         border: 1px solid red;  
 
-     }  
 
-     select.ng-invalid.ng-touched {  
 
-         border: 1px solid red;  
 
-     }  
 
-   
 
-     input.ng-valid.ng-touched {  
 
-         border: 1px solid green;  
 
-     }  
 
-     select.ng-valid.ng-touched {  
 
-         border: 1px solid green;  
 
-     }  
 
-     `]  
 
- })  
 
- export class NewUserComponent implements OnInit {  
 
-   user: User;  
 
-   countries: any[];  
 
-   
 
-   constructor() {  
 
-     this.user = new User();  
 
-   }  
 
-   
 
-   ngOnInit() {  
 
-     this.countries = COUNTRIES;  
 
-   }  
 
-   
 
-   submit(event: Event) {  
 
-     console.log(this.user);  
 
-   }  
 
- }  
 
-   
 
- class User {  
 
-   firstName: string;  
 
-   middleName: String;  
 
-   lastName: String;  
 
-   email: String;  
 
-   country: String;  
 
- } 
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
-   
 
- import { AppComponent } from './app.component';  
 
- import { UserListComponent} from './components/user/user.list.component';  
 
- import { NewUserComponent } from './components/user/new.user.component'  
 
- import { TodoComponent } from './components/todo/todo.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
- import { PostListComponent } from './components/posts/post.list.component';  
 
- import { UserService } from './services/user.service';  
 
- import { HighlightDirective } from './directives/highlight.directive';  
 
- import { UserComponent } from './components/user/user.component';  
 
- import { AlbumListComponent } from './components/albums/album.list.component';  
 
- import { SearchComponent } from './components/filter/search.component';  
 
- import { APP_ROUTES } from './app.routes';  
 
-   
 
- @NgModule({  
 
-   imports: [BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [SearchComponent, AlbumListComponent, NgbdModalBasic,, NewUserComponent, TodoComponent, NavComponent, AppComponent, UserListComponent, PostListComponent, HighlightDirective],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { }  
 
 
Output
![Angular]()
![Angular]()
Source code for point number #11
package.json
- {  
 
-   "name": "angular-quickstart",  
 
-   "version": "1.0.0",  
 
-     ---------------------------  
 
-     ---------------------------  
 
-     ---------------------------  
 
-   "keywords": [],  
 
-   "author": "",  
 
-   "license": "MIT",  
 
-   "dependencies": {  
 
-     -----------------------------  
 
-     -----------------------------  
 
-     -----------------------------  
 
-     "@ng-bootstrap/ng-bootstrap": "^1.0.0",  
 
-     "bootstrap": "^4.0.0-beta.3",  
 
-     -----------------------------  
 
-     -----------------------------  
 
-     -----------------------------  
 
-   },  
 
-   "devDependencies": {  
 
-     ------------  
 
-     ------------  
 
-     ------------  
 
-   "repository": {}  
 
- }  
 
 
app.module.ts
- import { NgModule } from '@angular/core';  
 
- import { BrowserModule } from '@angular/platform-browser';  
 
- import { FormsModule } from '@angular/forms';  
 
- import { HttpModule } from '@angular/http';  
 
- import { RouterModule } from '@angular/router';  
 
-   
 
- import { AppComponent } from './app.component';  
 
- import { UserListComponent} from './components/user/user.list.component';  
 
- import { NewUserComponent } from './components/user/new.user.component'  
 
- import { TodoComponent } from './components/todo/todo.component';  
 
- import { NavComponent } from './components/nav/nav.component';  
 
- import { PostListComponent } from './components/posts/post.list.component';  
 
- import { UserService } from './services/user.service';  
 
- import { HoverDirective } from './directives/hover.directive';  
 
- import { HighlightDirective } from './directives/highlight.directive';  
 
- import { UserComponent } from './components/user/user.component';  
 
- import { AlbumListComponent } from './components/albums/album.list.component';  
 
- import { SearchComponent } from './components/filter/search.component';  
 
- import { APP_ROUTES } from './app.routes';  
 
- import {NgbModule} from '@ng-bootstrap/ng-bootstrap';  
 
- import { NgbdModalBasic } from './components/user/modal-basic';  
 
-   
 
- @NgModule({  
 
-   imports: [NgbModule.forRoot(), BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(APP_ROUTES)],  
 
-   declarations: [SearchComponent, AlbumListComponent, NgbdModalBasic, UserComponent , NewUserComponent, TodoComponent, NavComponent, AppComponent, UserListComponent, PostListComponent, HoverDirective, HighlightDirective],  
 
-   bootstrap: [AppComponent],  
 
-   providers: [UserService]  
 
- })  
 
- export class AppModule { }  
 
 
Source code for point number #13
![Angular]()
Finally the app.router.ts fie looks as below
app.routes.ts
- import { Routes } from '@angular/router';  
 
- import { UserListComponent } from './components/user/user.list.component';  
 
- import { NewUserComponent } from './components/user/new.user.component';  
 
- import { TodoComponent } from './components/todo/todo.component';  
 
- import { UserComponent } from './components/user/user.component';  
 
- import { AlbumListComponent } from './components/albums/album.list.component';  
 
- export const APP_ROUTES: Routes = [  
 
-   {  
 
-     path: '', component: UserListComponent  
 
-   },  
 
-   {  
 
-     path: 'users',  
 
-     children: [  
 
-       {  
 
-         path: 'new', component: NewUserComponent,  
 
-       },  
 
-       {  
 
-         path: '', component: UserListComponent  
 
-       }  
 
-     ]  
 
-   },  
 
-   {  
 
-     path: 'user/:id', component: UserComponent  
 
-   },  
 
-   {  
 
-     path: 'todos',  
 
-     component: TodoComponent  
 
-   },  
 
-   {  
 
-     path: 'todos/:id', component: TodoComponent  
 
-   },  
 
-   {  
 
-     path: 'albums',  
 
-     component: AlbumListComponent  
 
-   },  
 
-   {  
 
-     path: 'albums/:id', component: AlbumListComponent  
 
-   }  
 
- ];  
 
 
Please find the complete source code in zip format, you can download and play around with it.
Steps to run the code
Step #1 - npm install
Step #2 - npm start
More articles on angular
I would appreciate your valuable comments. 
 |  |  |  |   |  |  |  |  |  | 
Text-to-speech function is limited to 200 characters