Angular 6 Notes
Angular 6 Notes
AngularJS is based on the model view controller, whereas Angular 4 is based on the components
structure. Angular 6 works on the same structure as Angular4 but is faster when compared to
Angular4.
Angular6 uses TypeScript 2.9 version whereas Angular 4 uses TypeScript version 2.2. This
brings a lot of difference in the performance.
To install Angular 6, the Angular team came up with Angular CLI which eases the installation.
You need to run through a few commands to install Angular 6.
To get started with the installation, we first need to make sure we have nodejs and npm installed
with the latest version. The npm package gets installed along with nodejs.
node -v
v8.11.3
The command prompt shows v8.11.3. Once nodejs is installed, npm will also get installed along
with it.
To check the version of npm, type command npm -v in the terminal. It will display the version
of npm as shown below.
npm -v
v5.6.0
The version of npm is 5.6.0. Now that we have nodejs and npm installed, let us run the angular
cli commands to install Angular 6. You will see the following commands on the webpage −
Let us start with the first command in the command line and see how it works.
To start with, we will create an empty directory wherein, we will run the Angular CLI command.
We have created an empty folder ProjectA4 and installed the Angular CLI command. We have
also used -g to install Angular CLI globally. Now, you can create your Angular 4 project in any
directory or folder and you don�t have to install Angular CLI project wise, as it is installed on
your system globally and you can make use of it from any directory.
Let us now check whether Angular CLI is installed or not. To check the installation, run the
following command in the terminal −
ng -v
_ _ ____ _ ___
/ \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|
/ ? \ | '_ \ / _` | | | | |/ _` | '__| | | | | | |
/ ___ \| | | | (_| | |_| | | (_| | | | |___| |___ | |
/_/ \_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___|
|___/
Package Version
------------------------------------------------------
@angular-devkit/architect 0.7.3
@angular-devkit/core 0.7.3
@angular-devkit/schematics 0.7.3
@schematics/angular 0.7.3
@schematics/update 0.7.3
rxjs 6.2.2
typescript 2.9.2
We get the @angular/cli version, which is at present 6.1.3. The node version running is 8.11.3
and also the OS details. The above details tell us that we have installed angular cli successfully
and now we are ready to commence with our project.
We have now installed Angular 6. Let us now create our first project in Angular 6. To create a
project in Angular 6, we will use the following command −
ng new projectname
ng new Angular6App
CREATE Angular6App/angular.json (3593 bytes)
CREATE Angular6App/package.json (1317 bytes)
CREATE Angular6App/README.md (1028 bytes)
CREATE Angular6App/tsconfig.json (408 bytes)
CREATE Angular6App/tslint.json (2805 bytes)
CREATE Angular6App/.editorconfig (245 bytes)
CREATE Angular6App/.gitignore (503 bytes)
CREATE Angular6App/src/favicon.ico (5430 bytes)
CREATE Angular6App/src/index.html (298 bytes)
CREATE Angular6App/src/main.ts (370 bytes)
CREATE Angular6App/src/polyfills.ts (3194 bytes)
CREATE Angular6App/src/test.ts (642 bytes)
CREATE Angular6App/src/styles.css (80 bytes)
CREATE Angular6App/src/browserslist (375 bytes)
CREATE Angular6App/src/karma.conf.js (964 bytes)
CREATE Angular6App/src/tsconfig.app.json (170 bytes)
CREATE Angular6App/src/tsconfig.spec.json (256 bytes)
CREATE Angular6App/src/tslint.json (314 bytes)
CREATE Angular6App/src/assets/.gitkeep (0 bytes)
CREATE Angular6App/src/environments/environment.prod.ts (51 bytes)
CREATE Angular6App/src/environments/environment.ts (642 bytes)
CREATE Angular6App/src/app/app.module.ts (314 bytes)
CREATE Angular6App/src/app/app.component.html (1141 bytes)
CREATE Angular6App/src/app/app.component.spec.ts (1010 bytes)
CREATE Angular6App/src/app/app.component.ts (215 bytes)
CREATE Angular6App/src/app/app.component.css (0 bytes)
CREATE Angular6App/e2e/protractor.conf.js (752 bytes)
CREATE Angular6App/e2e/tsconfig.e2e.json (213 bytes)
CREATE Angular6App/e2e/src/app.e2e-spec.ts (307 bytes)
CREATE Angular6App/e2e/src/app.po.ts (208 bytes)
The project Angular6App is created successfully. It installs all the required packages necessary
for our project to run in Angular 6. Let us now switch to the project created, which is in the
directory Angular6App. Change the directory in the command line - cd Angular 6-app.
We will use Visual Studio Code IDE for working with Angular 6; you can use any IDE, i.e.,
Atom, WebStorm, etc.
Now that we have the file structure for our project, let us compile our project with the following
command −
ng serve
The ng serve command builds the application and starts the web server.
The web server starts on port 4200. Type the url http://localhost:4200/ in the browser and see
the output. You will be directed to the following screen −
Let us now make some changes to display the following content −
Let us complete the project setup. If you see we have used port 4200, which is the default port
that angular-cli makes use of while compiling. You can change the port if you wish using the
following command −
e2e − end to end test folder. Mainly e2e is used for integration testing and helps ensure
the application works fine.
node_modules − The npm package installed is node_modules. You can open the folder
and see the packages available.
src − This folder is where we will work on the project using Angular 4.
At present, if you open the file in the editor, you will get the following modules added in it.
"@angular/animations": "^6.1.0",
"@angular/common": "^6.1.0",
"@angular/compiler": "^6.1.0",
"@angular/core": "^6.1.0",
"@angular/forms": "^6.1.0",
"@angular/http": "^6.1.0",
"@angular/platform-browser": "^6.1.0",
"@angular/platform-browser-dynamic": "^6.1.0",
"@angular/router": "^6.1.0",
"core-js": "^2.5.4",
"rxjs": "^6.0.0",
"zone.js": "~0.8.26"
In case you need to add more libraries, you can add those over here and run the npm install
command.
The src folder is the main folder, which internally has a different file structure.
app
It contains the files described below. These files are installed by angular-cli by default.
app.module.ts − If you open the file, you will see that the code has reference to different
libraries, which are imported. Angular-cli has used these default libraries for the import -
angular/core, platform-browser. The names itself explain the usage of the libraries.
They are imported and saved into variables such as declarations, imports, providers, and
bootstrap.
imports − This will have the modules imported as shown above. At present, BrowserModule is
part of the imports which is imported from @angular/platform-browser.
providers − This will have reference to the services created. The service will be discussed in a
subsequent chapter.
bootstrap − This has reference to the default component created, i.e., AppComponent.
app.component.css − You can write your css structure over here. Right now, we have
added the background color to the div as shown below.
.divdetails{
background-color: #ccc;
}
This is the default html code currently available with the project creation.
Assets
Environment
This folder has the details for the production or the dev environment. The folder contains two
files.
environment.prod.ts
environment.ts
Both the files have details of whether the final file should be compiled in the production
environment or the dev environment.
The additional file structure of Angular 4 app folder includes the following −
favicon.ico
index.html
<!doctype html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>HTTP Search Param</title>
<base href = "/">
<link href = "https://fonts.googleapis.com/icon?family=Material+Icons"
rel = "stylesheet">
<link href =
"https://fonts.googleapis.com/css?family=Roboto|Roboto+Mono" rel =
"stylesheet">
<link href = "styles.c7c7b8bf22964ff954d3.bundle.css" rel =
"stylesheet">
<meta name = "viewport" content = "width = device-width, initial-scale
= 1">
<link rel = "icon" type = "image/x-icon" href = "favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html>
The body has <app-root></app-root>. This is the selector which is used in app.component.ts
file and will display the details from app.component.html file.
main.ts
main.ts is the file from where we start our project development. It starts with importing the basic
module which we need. Right now if you see angular/core, angular/platform-browser-dynamic,
app.module and environment is imported by default during angular-cli installation and project
setup.
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule);
The platformBrowserDynamic
.bootstrapModuleAppModule
has the parent module reference AppModule. Hence, when it executes in the browser, the file
that is called is index.html. Index.html internally refers to main.ts which calls the parent module,
i.e., AppModule when the following code executes −
platformBrowserDynamic().bootstrapModule(AppModule);
When AppModule is called, it calls app.module.ts which further calls the AppComponent based
on the boostrap as follows −
bootstrap: [AppComponent]
In app.component.ts, there is a selector: app-root which is used in the index.html file. This will
display the contents present in app.component.html.
styles.css
test.ts
Here, the unit test cases for testing the project will be handled.
tsconfig.app.json
This is used during compilation, it has the config details that need to be used to run the
application.
tsconfig.spec.json
typings.d.ts
app.component.css
app.component.html
app.component.spec.ts
app.component.ts
app.module.ts
The above files were created by default when we created new project using the angular-cli
command.
If you open up the app.module.ts file, it has some libraries which are imported and also a
declarative which is assigned the appcomponent as follows −
The declarations include the AppComponent variable, which we have already imported. This
becomes the parent component.
Now, angular-cli has a command to create your own component. However, the app component
which is created by default will always remain the parent and the next components created will
form the child components.
When you run the above command in the command line, you will receive the following output −
Now, if we go and check the file structure, we will get the new-cmp new folder created under the
src/app folder.
If you see the above new-cmp.component.ts file, it creates a new class called
NewCmpComponent, which implements OnInit.In, which has a constructor and a method called
ngOnInit
Let us check how the flow works. Now, the app component, which is created by default becomes
the parent component. Any component added later becomes the child component.
When we hit the url in the http://localhost:4200/ browser, it first executes the index.html file
which is shown below −
<!doctype html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>Angular 6 Application</title>
<base href = "/">
<meta name = "viewport" content = "width = device-width, initial-scale
= 1">
<link rel = "icon" type = "image/x-icon" href = "favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html>
The above is the normal html file and we do not see anything that is printed in the browser. Take
a look at the tag in the body section.
<app-root></app-root>
This is the root tag created by the Angular by default. This tag has the reference in the main.ts
file.
AppModule is imported from the app of the main parent module, and the same is given to the
bootstrap Module, which makes the appmodule load.
Here, the AppComponent is the name given, i.e., the variable to store the reference of the app.
Component.ts and the same is given to the bootstrap. Let us now see the app.component.ts file.
Angular core is imported and referred as the Component and the same is used in the Declarator
as −
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
In the declarator reference to the selector, templateUrl and styleUrl are given. The selector here
is nothing but the tag which is placed in the index.html file that we saw above.
The class AppComponent has a variable called title, which is displayed in the browser.
Now that we have created a new component called new-cmp. The same gets included in the
app.module.ts file, when the command is run for creating a new component.
new-cmp.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-new-cmp',
templateUrl: './new-cmp.component.html',
styleUrls: ['./new-cmp.component.css']
})
export class NewCmpComponent implements OnInit {
constructor() { }
ngOnInit() {}
}
Here, we have to import the core too. The reference of the component is used in the declarator.
The declarator has the selector called app-new-cmp and the templateUrl and styleUrl.
<p>
new-cmp works!
</p>
As seen above, we have the html code, i.e., the p tag. The style file is empty as we do not need
any styling at present. But when we run the project, we do not see anything related to the new
component getting displayed in the browser. Let us now add something and the same can be seen
in the browser later.
The selector, i.e., app-new-cmp needs to be added in the app.component .html file as follows −
Let us see the new component .html file and the new-cmp.component.ts file.
new-cmp.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-new-cmp',
templateUrl: './new-cmp.component.html',
styleUrls: ['./new-cmp.component.css']
})
export class NewCmpComponent implements OnInit {
newcomponent = "Entered in new component created";
constructor() {}
ngOnInit() { }
}
In the class, we have added one variable called new component and the value is "Entered in
new component created".
<p>
{{newcomponent}}
</p>
<p>
new-cmp works!
</p>
Angular Modules
Module in Angular refers to a place where you can group the components, directives, pipes, and
services, which are related to the application.
In case you are developing a website, the header, footer, left, center and the right section become
part of a module.
To define module, we can use the NgModule. When you create a new project using the Angular
-cli command, the ngmodule is created in the app.module.ts file by default and it looks as
follows −
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [AppComponent]
})
It starts with @NgModule and contains an object which has declarations, import s, providers and
bootstrap.
Declaration
It is an array of components created. If any new component gets created, it will be imported first
and the reference will be included in declarations as shown below −
declarations: [
AppComponent,
NewCmpComponent
]
Import
It is an array of modules required to be used in the application. It can also be used by the
components in the Declaration array. For example, right now in the @NgModule we see the
Browser Module imported. In case your application needs forms, you can include the module as
follows −
imports: [
BrowserModule,
FormsModule
]
Providers
This will include the services created.
Bootstrap
The variable in the app.component.html file is referred as {{title}} and the value of title is
initialized in the app.component.ts file and in app.component.html, the value is displayed.
Let us now create a dropdown of months in the browser. To do that , we have created an array of
months in app.component.ts as follows −
The month's array that is shown above is to be displayed in a dropdown in the browser. For this,
we will use the following line of code −
We have created the normal select tag with option. In option, we have used the for loop. The for
loop is used to iterate over the months' array, which in turn will create the option tag with the
value present in the months.
The syntax for in Angular is *ngFor = "let I of months" and to get the value of months we are
displaying it in {{i}}.
The two curly brackets help with data binding. You declare the variables in your
app.component.ts file and the same will be replaced using the curly brackets.
Let us see the output of the above month's array in the browser
The variable that is set in the app.component.ts can be bound with the app.component.html
using the curly brackets; for example, {{}}.
Let us now display the data in the browser based on condition. Here, we have added a variable
and assigned the value as true. Using the if statement, we can hide/show the content to be
displayed.
Example
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Angular 4 Project!';
//array of months.
months = ["January", "February", "March", "April",
"May", "June", "July", "August", "September",
"October", "November", "December"];
isavailable = true; //variable is set to true
}
<!--The content below is only a placeholder and can be replaced.-->
<div style = "text-align:center">
<h1>
Welcome to {{title}}.
</h1>
</div>
<div> Months :
<select>
<option *ngFor = "let i of months">{{i}}</option>
</select>
</div>
<br/>
<div>
<span *ngIf = "isavailable">Condition is valid.</span>
<!--over here based on if condition the text condition is valid is
displayed.
If the value of isavailable is set to false it will not display the text.--
>
</div>
Output
Let us try the above example using the IF THEN ELSE condition.
Example
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Angular 4 Project!';
//array of months.
months = ["January", "February", "March", "April",
"May", "June", "July", "August", "September",
"October", "November", "December"];
isavailable = false;
}
In this case, we have made the isavailable variable as false. To print the else condition, we will
have to create the ng-template as follows −
If is used with the else condition and the variable used is condition1. The same is assigned as an
id to the ng-template, and when the available variable is set to false the text Condition is
invalid is displayed.
Now, we will make the variable isavailable as true. In the html, the condition is written in the
following way −
If the variable is true, then condition1, else condition2. Now, two templates are created with id
#condition1 and #condition2.
app.component.html
<!--The content below is only a placeholder and can be replaced.-->
<div style = "text-align:center">
<h1>
Welcome to {{title}}.
</h1>
</div>
<div> Months :
<select>
<option *ngFor = "let i of months">{{i}}</option>
</select>
</div>
<br/>
<div>
<span *ngIf = "isavailable; then condition1 else condition2">
Condition is valid.
</span>
<ng-template #condition1>Condition is valid</ng-template>
<ng-template #condition2>Condition is invalid</ng-template>
</div>
<button (click)="myClickFunction($event)">
Click Me
</button>
In the app.component.html file, we have defined a button and added a function to it using the
click event.
(click)="myClickFunction($event)"
Upon clicking the button, the control will come to the function myClickFunction and a dialog
box will appear, which displays the Button is clicked as shown in the following screenshot −
Let us now add the change event to the dropdown.
The following line of code will help you add the change event to the dropdown −
The console message "Changed month from the Dropdown" is displayed in the console along
with the event.
Let us add an alert message in app.component.ts when the value from the dropdown is changed
as shown below −
isavailable = true;
myClickFunction(event) {
//just added console.log which will display the event details in
browser
on click of the button.
alert("Button is clicked");
console.log(event);
}
changemonths(event) {
alert("Changed month from the Dropdown");
}
}
When the value in dropdown is changed, a dialog box will appear and the following message
will be displayed - "Changed month from the Dropdown".
Angular Templates
Angular 6 uses the <ng-template> as the tag similar to Angular 4 instead of <template> which
is used in Angular2. The reason Angular 4 changed <template> to <ng-template> is because
there is a name conflict between the <template> tag and the html <template> standard tag. It
will deprecate completely going ahead.
Let us now use the template along with the if else condition and see the output.
app.component.html
<!--The content below is only a placeholder and can be replaced.-->
<div style = "text-align:center">
<h1>
Welcome to {{title}}.
</h1>
</div>
<div> Months :
<select (change) = "changemonths($event)" name = "month">
<option *ngFor = "let i of months">{{i}}</option>
</select>
</div>
<br/>
<div>
<span *ngIf = "isavailable;then condition1 else condition2">Condition is
valid.</span>
<ng-template #condition1>Condition is valid from template</ng-template>
<ng-template #condition2>Condition is invalid from template</ng-template>
</div>
<button (click) = "myClickFunction($event)">Click Me</button>
For the Span tag, we have added the if statement with the else condition and will call template
condition1, else condition2.
If the condition is true, then the condition1 template is called, otherwise condition2.
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Angular 6 Project!';
//array of months.
months = ["January", "February", "March", "April",
"May", "June", "July", "August", "September",
"October", "November", "December"];
isavailable = false;
myClickFunction(event) {
this.isavailable = false;
}
changemonths(event) {
alert("Changed month from the Dropdown");
console.log(event);
}
}
The variable isavailable is false so the condition2 template is printed. If you click the button, the
respective template will be called. If you inspect the browser, you will see that you never get the
span tag in the dom. The following example will help you understand the same.
If you inspect the browser, you will see that the dom does not have the span tag. It has the
Condition is invalid from template in the dom.
The following line of code in html will help us get the span tag in the dom.
If we remove the then condition, we get the "Condition is valid" message in the browser and
the span tag is also available in the dom. For example, in app.component.ts, we have made the
isavailable variable as true.
Angular Directives
These form the main class having details of how the component should be processed, instantiated
and used at runtime.
Structural Directives
A structure directive basically deals with manipulating the dom elements. Structural directives
have a * sign before the directive. For example, *ngIf and *ngFor.
Attribute Directives
Attribute directives deal with changing the look and behavior of the dom element. You can
create your own directives as shown below.
In this section, we will discuss about Custom Directives to be used in components. Custom
directives are created by us and are not standard.
Let us see how to create the custom directive. We will create the directive using the command
line. The command to create the directive using the command line is −
ng g directive nameofthedirective
e.g
ng g directive changeText
The above files, i.e., change-text.directive.spec.ts and change-text.directive.ts get created and
the app.module.ts file is updated.
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { NewCmpComponent } from './new-cmp/new-cmp.component';
import { ChangeTextDirective } from './change-text.directive';
@NgModule({
declarations: [
AppComponent,
NewCmpComponent,
ChangeTextDirective
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
The ChangeTextDirective class is included in the declarations in the above file. The class is
also imported from the file given below.
change-text. directive
import { Directive } from '@angular/core';
@Directive({
selector: '[appChangeText]'
})
export class ChangeTextDirective {
constructor() { }
}
The above file has a directive and it also has a selector property. Whatever we define in the
selector, the same has to match in the view, where we assign the custom directive.
change-text.directive.ts
import { Directive, ElementRef} from '@angular/core';
@Directive({
selector: '[appChangeText]'
})
export class ChangeTextDirective {
constructor(Element: ElementRef) {
console.log(Element);
Element.nativeElement.innerText = "Text is changed by changeText
Directive. ";
}
}
In the above file, there is a class called ChangeTextDirective and a constructor, which takes the
element of type ElementRef, which is mandatory. The element has all the details to which the
Change Text directive is applied.
We have added the console.log element. The output of the same can be seen in the browser
console. The text of the element is also changed as shown above.
Angular Pipes
what are Pipes in Angular 6. Pipes were earlier called filters in Angular1 and called pipes in
Angular 2 onwards.
The | character is used to transform data. Following is the syntax for the same
Here, we want to display the text given to uppercase. This can be done using pipes as follows −
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Angular 6 Project!';
}
<b>{{title | uppercase}}</b><br/>
<b>{{title | lowercase}}</b>
Lowercasepipe
Uppercasepipe
Datepipe
Currencypipe
Jsonpipe
Percentpipe
Decimalpipe
Slicepipe
We have already seen the lowercase and uppercase pipes. Let us now see how the other pipes
work.
The following line of code will help us define the required variables in app.component.ts file −
To create a custom pipe, we have created a new ts file. Here, we want to create the sqrt custom
pipe. We have given the same name to the file and it looks as follows −
app.sqrt.ts
import {Pipe, PipeTransform} from '@angular/core';
@Pipe ({
name : 'sqrt'
})
export class SqrtPipe implements PipeTransform {
transform(val : number) : number {
return Math.sqrt(val);
}
}
To create a custom pipe, we have to import Pipe and Pipe Transform from Angular/core. In the
@Pipe directive, we have to give the name to our pipe, which will be used in our .html file.
Since, we are creating the sqrt pipe, we will name it sqrt.
As we proceed further, we have to create the class and the class name is SqrtPipe. This class
will implement the PipeTransform.
The transform method defined in the class will take argument as the number and will return the
number after taking the square root.
Since we have created a new file, we need to add the same in app.module.ts. This is done as
follows −
We have created the app.sqrt.ts class. We have to import the same in app.module.ts and specify
the path of the file. It also has to be included in the declarations as shown above.
Let us now see the call made to the sqrt pipe in the app.component.html file.
<h1>Custom Pipe</h1>
<b>Square root of 25 is: {{25 | sqrt}}</b>
<br/>
<b>Square root of 729 is: {{729 | sqrt}}</b>
Angular Routing
Routing basically means navigating between pages. You have seen many sites with links that
direct you to a new page. This can be achieved using routing. Here the pages that we are
referring to will be in the form of components. We have already seen how to create a component.
Let us now create a component and see how to use routing with it.
In the main parent component app.module.ts, we have to now include the router module as
shown below −
Here, the RouterModule is imported from angular/router. The module is included in the imports
as shown below −
RouterModule.forRoot([
{
path: 'new-cmp',
component: NewCmpComponent
}
])
RouterModule refers to the forRoot which takes an input as an array, which in turn has the
object of the path and the component. Path is the name of the router and component is the name
of the class, i.e., the component created.
New-cmp.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-new-cmp',
templateUrl: './new-cmp.component.html',
styleUrls: ['./new-cmp.component.css']
})
export class NewCmpComponent implements OnInit {
newcomponent = "Entered in new component created";
constructor() {}
ngOnInit() { }
}
New-cmp.component.html
<p>
{{newcomponent}}
</p>
<p>
new-cmp works!
</p>
Now, we need the above content from the html file to be displayed whenever required or clicked
from the main module. For this, we need to add the router details in the app.component.html.
<h1>Custom Pipe</h1>
<b>Square root of 25 is: {{25 | sqrt}}</b><br/>
<b>Square root of 729 is: {{729 | sqrt}}</b>
<br />
<br />
<br />
<a routerLink = "new-cmp">New component</a>
<br />
<br/>
<router-outlet></router-outlet>
In the above code, we have created the anchor link tag and given routerLink as "new-cmp".
This is referred in app.module.ts as the path.
When a user clicks new component, the page should display the content. For this, we need the
following tag - <router-outlet> </router-outlet>.
The above tag ensures that the content in the new-cmp.component.html will be displayed on the
page when a user clicks new component.
When a user clicks New component, the page is not refreshed and the contents are shown to the
user without any reloading. Only a particular piece of the site code will be reloaded when
clicked. This feature helps when we have heavy content on the page and needs to be loaded
based on the user interaction. The feature also gives a goo
Angular Services
Services in Angular 6.
We might come across a situation where we need some code to be used everywhere on the page.
It can be for data connection that needs to be shared across components, etc. Services help us
achieve that. With services, we can access methods and properties across other components in
the entire project.
To create a service, we need to make use of the command line. The command for the same is −
myservice.service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class MyserviceService {
constructor() { }
}
Here, the Injectable module is imported from the @angular/core. It contains the @Injectable
method and a class called MyserviceService. We will create our service function in this class.
Before creating a new service, we need to include the service created in the main parent
app.module.ts.
We have imported the Service with the class name and the same class is used in the providers.
Let us now switch back to the service class and create a service function.
In the service class, we will create a function which will display today�s date. We can use the
same function in the main parent component app.component.ts and also in the new component
new-cmp.component.ts that we created in the previous chapter.
Let us now see how the function looks in the service and how to use it in components.
In the above service file, we have created a function showTodayDate. Now we will return the
new Date
created. Let us see how we can access this function in the component class.
app.component.ts
import { Component } from '@angular/core';
import { MyserviceService } from './myservice.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Angular 6 Project!';
todaydate;
constructor(private myservice: MyserviceService) {}
ngOnInit() {
this.todaydate = this.myservice.showTodayDate();
}
}
The ngOnInit function gets called by default in any component created. The date is fetched from
the service as shown above. To fetch more details of the service, we need to first include the
service in the component ts file.
{{todaydate}}
<app-new-cmp></app-new-cmp>
// data to be displayed to user from the new component class.
Let us now see how to use the service in the new component created.
In the new component that we have created, we need to first import the service that we want and
access the methods and properties of the same. Please see the code highlighted. The todaydate is
displayed in the component html as follows −
<p>
{{newcomponent}}
</p>
<p>
Today's Date : {{todaydate}}
</p>
The selector of the new component is used in the app.component.html file. The contents from
the above html file will be displayed in the browser as shown below −
If you change the property of the service in any component, the same is changed in other
components too. Let us now see how this works.
We will define one variable in the service and use it in the parent and the new component. We
will again change the property in the parent component and will see if the same is changed in the
new component or not.
In myservice.service.ts, we have created a property and used the same in other parent and new
component.
Let us now use the serviceproperty variable in other components. In app.component.ts, we are
accessing the variable as follows −
We will now fetch the variable and work on the console.log. In the next line, we will change the
value of the variable to "component created". We will do the same in new-cmp.component.ts.
Now when you execute it in the browser, the service property will be changed since the value of
it is changed in app.component.ts and the same will be displayed for the new-
cmp.component.ts.
Http Service will help us fetch external data, post to it, etc. We need to import the http module to
make use of the http service. Let us consider an example to understand how to make use of the
http service.
To start using the http service, we need to import the module in app.module.ts as shown below
−
If you see the highlighted code, we have imported the HttpModule from @angular/http and the
same is also added in the imports array.
Let us understand the code highlighted above. We need to import http to make use of the service,
which is done as follows −
In the class AppComponent, a constructor is created and the private variable http of type Http.
To fetch the data, we need to use the get API available with http as follows
this.http.get();
We will use the test url − https://jsonplaceholder.typicode.com/users to fetch the json data. Two
operations are performed on the fetched url data map and subscribe. The Map method helps to
convert the data to json format. To use the map, we need to import the same as shown below −
Once the map is done, the subscribe will log the output in the console as shown in the browser −
If you see, the json objects are displayed in the console. The objects can be displayed in the
browser too.
For the objects to be displayed in the browser, update the codes in app.component.html and
app.component.ts as follows −
In app.component.ts, using the subscribe method we will call the display data method and pass
the data fetched as the parameter to it.
In the display data method, we will store the data in a variable httpdata. The data is displayed in
the browser using for over this httpdata variable, which is done in the app.component.html file.
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "[email protected]",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
Let us now add the search parameter, which will filter based on specific data. We need to fetch
the data based on the search param passed.
app.component.ts
import { Component } from '@angular/core';
import { Http } from '@angular/http';
import { map} from 'rxjs/operators';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private http: Http) { }
httpdata;
name;
searchparam = 2;
ngOnInit() {
this.http.get("http://jsonplaceholder.typicode.com/users?id="+this.searchpara
m)
.pipe(map((response) => response.json()))
.subscribe((data) => this.displaydata(data));
}
displaydata(data) {this.httpdata = data;}
}
For the get api, we will add the search param id = this.searchparam. The searchparam is equal to
2. We need the details of id = 2 from the json file.
We have consoled the data in the browser, which is received from the http. The same is
displayed in the browser console. The name from the
Angular 6 - Http Client
HttpClient is introduced in Angular 6 and it will help us fetch external data, post to it, etc. We
need to import the http module to make use of the http service. Let us consider an example to
understand how to make use of the http service.
To start using the http service, we need to import the module in app.module.ts as shown below
−
If you see the highlighted code, we have imported the HttpClientModule from
@angular/common/http and the same is also added in the imports array.
Let us understand the code highlighted above. We need to import http to make use of the service,
which is done as follows −
import { HttpClient } from '@angular/common/http';
In the class AppComponent, a constructor is created and the private variable http of type Http.
To fetch the data, we need to use the get API available with http as follows
this.http.get();
We will use the test url − https://jsonplaceholder.typicode.com/users to fetch the json data. The
subscribe will log the output in the console as shown in the browser −
If you see, the json objects are displayed in the console. The objects can be displayed in the
browser too.
For the objects to be displayed in the browser, update the codes in app.component.html and
app.component.ts as follows −
In app.component.ts, using the subscribe method we will call the display data method and pass
the data fetched as the parameter to it.
In the display data method, we will store the data in a variable httpdata. The data is displayed in
the browser using for over this httpdata variable, which is done in the app.component.html file.
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "[email protected]",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
The object has properties such as id, name, username, email, and address that internally has
street, city, etc. and other details related to phone, website, and company. Using the for loop, we
will display the name and the city details in the browser as shown in the app.component.html
file.
Let us now add the search parameter, which will filter based on specific data. We need to fetch
the data based on the search param passed.
app.component.ts
import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private http: HttpClient) { }
httpdata;
name;
searchparam = 2;
ngOnInit() {
this.http.get("http://jsonplaceholder.typicode.com/users?id="+this.searchpara
m)
.subscribe((data) => this.displaydata(data));
}
displaydata(data) {this.httpdata = data;}
}
For the get api, we will add the search param id = this.searchparam. The searchparam is equal to
2. We need the details of id = 2 from the json file.
We have consoled the data in the browser, which is received from the http. The same is
displayed in the browser console. The name from the json with i
Angular Forms
how forms are used in Angular 6. We will discuss two ways of working with forms - template
driven form and model driven forms.
With a template driven form, most of the work is done in the template; and with the model
driven form, most of the work is done in the component class.
Let us now consider working on the Template driven form. We will create a simple login form
and add the email id, password and submit the button in the form. To start with, we need to
import to FormsModule from @angular/core which is done in app.module.ts as follows −
So in app.module.ts, we have imported the FormsModule and the same is added in the imports
array as shown in the highlighted code.
We have created a simple form with input tags having email id, password and the submit button.
We have assigned type, name, and placeholder to it.
In template driven forms, we need to create the model form controls by adding the ngModel
directive and the name attribute. Thus, wherever we want Angular to access our data from
forms, add ngModel to that tag as shown above. Now, if we have to read the emailid and passwd,
we need to add the ngModel across it.
If you see, we have also added the ngForm to the #userlogin. The ngForm directive needs to be
added to the form template that we have created. We have also added function onClickSubmit
and assigned userlogin.value to it.
Let us now create the function in the app.component.ts and fetch the values entered in the form.
In the above app.component.ts file, we have defined the function onClickSubmit. When you
click on the form submit button, the control will come to the above function.
In the model driven form, we need to import the ReactiveFormsModule from @angular/forms
and use the same in the imports array.
In app.component.ts, we need to import a few modules for the model driven form. For example,
import { FormGroup, FormControl } from '@angular/forms'.
The variable formdata is initialized at the start of the class and the same is initialized with
FormGroup as shown above. The variables emailid and passwd are initialized with default values
to be displayed in the form. You can keep it blank in case you want to.
<div>
<form [formGroup] = "formdata" (ngSubmit) =
"onClickSubmit(formdata.value)" >
<input type = "text" class = "fortextbox" name = "emailid" placeholder
= "emailid"
formControlName="emailid">
<br/>
The input tag formControlName is used. It is given a value that we have used in the
app.component.ts file.
On clicking submit, the control will pass to the function onClickSubmit, which is defined in the
app.component.ts file.
On clicking Login, the value will be displayed as shown in the above screenshot.
Form Validation
Let us now discuss form validation using model driven form. You can use the built-in form
validation or also use the custom validation approach. We will use both the approaches in the
form. We will continue with the same example that we created in one of our previous sections.
With Angular 4, we need to import Validators from @angular/forms as shown below −
You can just add validators or an array of validators required to tell Angular if a particular field
is mandatory.
Let us now try the same on one of the input textboxes, i.e., email id. For the email id, we have
added the following validation parameters −
Required
Pattern matching
In Validators.compose, you can add the list of things you want to validate on the input field.
Right now, we have added the required and the pattern matching parameters to take only valid
email.
In the app.component.html, the submit button is disabled if any of the form inputs are not valid.
This is done as follows −
<div>
<form [formGroup] = "formdata" (ngSubmit) =
"onClickSubmit(formdata.value)" >
<input type = "text" class = "fortextbox" name = "emailid" placeholder
= "emailid"
formControlName = "emailid">
<br/>
<input type = "password" class = "fortextbox" name = "passwd"
placeholder = "passwd" formControlName = "passwd">
<br/>
<input type = "submit" [disabled] = "!formdata.valid" class =
"forsubmit"
value = "Log In">
</form>
</div>
<p>
Email entered is : {{emailid}}
</p>
For the submit button, we have added disabled in the square bracket, which is given value -
!formdata.valid. Thus, if the formdata.valid is not valid, the button will remain disabled and the
user will not be able to submit it.
In the above case, the email id entered is invalid, hence the login button is disabled. Let us now
try entering the valid email id and see the difference.
Now, the email id entered is valid. Thus, we can see the login button is enabled and the user will
be able to submit it. With this, the email id entered is displayed at the bottom.
Let us now try custom validation with the same form. For custom validation, we can define our
own custom function and add the required details in it. We will now see an example for the
same.
In the above example, we have created a function password validation and the same is used in a
previous section in the formcontrol − passwd: new FormControl"",this.passwordvalidation
In the function that we have created, we will check if the length of the characters entered is
appropriate. If the characters are less than five, it will return with the passwd true as shown
above - return {"passwd" : true};. If the characters are more than five, it will consider it as
valid and the login will be enabled.
Angular Animations
Animations add a lot of interaction between the html elements. Animation was also available
with Angular2. The difference with Angular 6 is that animation is no more a part of the
@angular/core library, but is a separate package that needs to be imported in app.module.ts.
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { BrowserAnimationsModule } from '@angular/platform-
browser/animations';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
<div>
<button (click) = "animate()">Click Me</button>
<div [@myanimation] = "state" class = "rotate">
<img src = "assets/images/img.png" width = "100" height = "100">
</div>
</div>
For the main div, we have added a button and a div with an image. There is a click event for
which the animate function is called. And for the div, the @myanimation directive is added and
given the value as state.
We have to import the animation function that is to be used in the .ts file as shown above.
Here we have imported trigger, state, style, transition, and animate from @angular/animations.
decorator −
animations: [
trigger('myanimation',[
state('smaller',style({
transform : 'translateY(100px)'
})),
state('larger',style({
transform : 'translateY(0px)'
})),
transition('smaller <=> larger',animate('300ms ease-in'))
])
]
Trigger defines the start of the animation. The first param to it is the name of the animation to be
given to the html tag to which the animation needs to be applied. The second param are the
functions we have imported - state, transition, etc.
The state function involves the animation steps, which the element will transition between. Right
now we have defined two states, smaller and larger. For smaller state, we have given the style
transform:translateY100px
and transform:translateY100px
.
Transition function adds animation to the html element. The first argument takes the states, i.e.,
start and end; the second argument accepts the animate function. The animate function allows
you to define the length, delay, and easing of a transition.
Let us now see the .html file to see how the transition function works
<div>
<button (click) = "animate()">Click Me</button>
<div [@myanimation] = "state" class="rotate">
<img src = "assets/images/img.png" width = "100" height = "100">
</div>
</div>
There is a style property added in the @component directive, which centrally aligns the div. Let
us consider the following example to understand the same −
styles:[`
div{
margin: 0 auto;
text-align: center;
width:200px;
}
.rotate{
width:100px;
height:100px;
border:solid 1px red;
}
`],
Here, a special character [``] is used to add styles to the html element, if any. For the div, we
have given the animation name defined in the app.component.ts file.
On the click of a button it calls the animate function, which is defined in the app.component.ts
file as follows −
The state variable is defined and is given the default value as smaller. The animate function
changes the state on click. If the state is larger, it will convert to smaller; and if smaller, it will
convert to larger.
This is how the output in the browser (http://localhost:4200/) will look like −
Upon clicking the Click Me button, the position of the image is changed as shown in the
following screenshot −
The transform function is applied in the y direction, which is changed from 0 to 100px when the
Click Me button is clicked. The image is stored in the assets/images folder.
Angular Materials
Materials offer a lot of built-in modules for your project. Features such as autocomplete,
datepicker, slider, menus, grids, and toolbar are available for use with materials in Angular 6.
To use materials, we need to import the package. Angular 2 also has all the above features but
they are available as part of the @angular/core module. Angular 6 has come up with a separate
module @angular/materials.. This helps the user to import the required materials.
To start using materials, you need to install two packages - materials and cdk. Material
components depend on the animation module for advanced features, hence you need the
animation package for the same, i.e., @angular/animations. The package has already been
updated in the previous chapter.
Let us now see the package.json. @angular/material and @angular/cdk are installed.
{
"name": "angular6-app",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true, "dependencies": {
"@angular/animations": "^6.1.0",
"@angular/cdk": "^6.4.7",
"@angular/common": "^6.1.0",
"@angular/compiler": "^6.1.0",
"@angular/core": "^6.1.0",
"@angular/forms": "^6.1.0",
"@angular/http": "^6.1.0",
"@angular/material": "^6.4.7",
"@angular/platform-browser": "^6.1.0",
"@angular/platform-browser-dynamic": "^6.1.0",
"@angular/router": "^6.1.0",
"core-js": "^2.5.4",
"rxjs": "^6.0.0",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.7.0",
"@angular/cli": "~6.1.3",
"@angular/compiler-cli": "^6.1.0",
"@angular/language-service": "^6.1.0",
"@types/jasmine": "~2.8.6",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"codelyzer": "~4.2.1",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~1.7.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.0",
"karma-jasmine": "~1.1.1",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.3.0",
"ts-node": "~5.0.1",
"tslint": "~5.9.1",
"typescript": "~2.7.2"
}
}
We have highlighted the packages that are installed to work with materials.
We will now import the modules in the parent module − app.module.ts as shown below.
In the above file, we have imported the following modules from @angular/materials.
imports: [
BrowserModule,
BrowserAnimationsModule,
MatButtonModule,
MatMenuModule,
FormsModule,
MatSidenavModule
]
The app.component.ts is as shown below −
@import "~@angular/material/prebuilt-themes/indigo-pink.css";
Menu
To add menu, <mat-menu></mat-menu> is used. The file and Save As items are added to the
button under mat-menu. There is a main button added Menu. The reference of the same is given
the <mat-menu> by using [matMenuTriggerFor]="menu" and using the menu with # in
<mat-menu>.
SideNav
To add sidenav, we need <mat-sidenav-container></mat-sidenav-container>. <mat-
sidenav></mat-sidenav> is added as a child to the container. There is another div added, which
triggers the sidenav by using click
="sidenav.open
". Following is the display of the menu and the sidenav in the browser −
In app.module.ts, we have imported the following module as shown below for datepicker.
<mat-form-field>
<input matInput [matDatepicker] = "picker" placeholder = "Choose a date">
<mat-datepicker-toggle matSuffix [for] = "picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
</mat-form-field>
Angular CLI makes it easy to start with any Angular project. Angular CLI comes with
commands that help us create and start on our project very fast. Let us now go through the
commands available to create a project, a component and services, change the port, etc.
To work with Angular CLI, we need to have it installed on our system. Let us use the following
command for the same −
To create a new project, we can run the following command in the command line and the project
will be created.
ng new PROJECT-NAME
cd PROJECT-NAME
ng serve //
ng serve // will compile and you can see the output of your project in the browser −
http://localhost:4200/
4200 is the default port used when a new project is created. You can change the port with the
following command −
The following table lists down a few important commands required while working with Angular
4 projects.
Whenever a new module, a component, or a service is created, the reference of the same is
updated in the parent module app.module.ts.