learn-angular v0.0.0
Learn Angular
Contents
- Introduction
- Roadmap
- Configuration
- Components
- Data Binding
- Directives
- Pipes
- Decorators
- Life Cycle Hooks
- Forms
- Http
- Module
- Router
- Observables
- JIT
- AOT
- CLI Commands
- Imports
- Learn From GitHub Repositories
- Learn From Websites
- Learn From Books
- Learn From YouTube Channels
- Learn More From Blogs Sites
- List of Online Compilers/Editors
- List of Twitter Users
- List of LinkedIn Users
Other Pages
Introduction
Angular is a platform and framework for building single-page client applications using HTML and TypeScript.
AngularJS vs Angular
AngularJS | Angular |
---|---|
Based on MVC Architecture | Based on Components |
Uses JavaScript to build the application | Uses TypeScript to build the application |
No Mobile Support | Mobile supports |
Run on only client-side | Runs on both client-side as well as server-side |
CLI not present | CLI present |
No SEO Friendly | Seo Friendly |
Roadmap - Link
Configuration
Prerequisites
- Node.js
Installation
Install the Angular CLI globally:
npm install -g @angular/cli
Check version
ng version
Create workspace:
ng new [PROJECT NAME]
Run the application:
cd [PROJECT NAME]
ng serve
Components
Component is the main building block of an Angular Application.
Three main building blocks
- Template
- Class
- Metadata
Template - Defines the layout and content of the View.
Class - Class provides the data & logic to the View.
MetaData - Metadata Provides additional information about the component to the Angular.
Component metadata properties
- Selector
- Providers
- Styles
- StyleUrls
- Template
- TemplateUrl
Selector - Defines the element name or CSS selector that identifies the component in the HTML template.
Providers - Defines the providers of the component's dependencies.
styles - Defines the inline styles for the component.
styleUrls - Defines an array of URLs of the stylesheets for the component.
template - Defines the HTML template for the component.
templateUrl - Defines the URL of the HTML template for the component.
Component Creation
Steps are:
- Navigate to your Angular project directory.
- Create a new file,
<component-name>
.component.ts. At the top of the file, add the following import statement.
import { Component } from '@angular/core';
After the import statement, add a @Component decorator.
@Component({ })
Choose a CSS selector for the component.
@Component({ selector: 'test-component', })
Define the HTML template that the component uses to display information. In most cases, this template is a separate HTML file.
@Component({ selector: 'test-component', templateUrl: './test-component.component.html', })
Select the styles for the component's template. In most cases, you define the styles for your component's template in a separate file.
@Component({ selector: 'test-component', templateUrl: './component.component.html', styleUrls: ['./component.component.css'] })
Add a class statement that includes the code for the component.
export class TestComponent { }
Register the Component in Angular Module -
import { TestComponent } from './app.component';
@NgModule({ declarations: [ TestComponent ] })
Complete code for the component creation
//test-component.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'test-component',
templateUrl: './component.component.html',
styleUrls: ['./component.component.css']
})
export class TestComponent {
}
//app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { TestComponent } from './app.component';
@NgModule({
declarations: [
AppComponent,
TestComponent
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Creating the inline Template & StyleUrls -
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: '<h1> {{title}} works </h1>',
styles: ['h1 { font-weight: bold; }']
})
export class AppComponent {
title = 'app';
}
Data binding
1. One way binding
a. From Component to View
Interpolation -
<h1>{{ firstText }} {{ lastText }}</h1>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
firstText = 'Interpolation';
lastText = 'Example';
}
Property binding - This allows for binding a property of an HTML element to a property in the component's class. It is denoted by square brackets ([]).
<h1 [innerText]="title"></h1>
<button [disabled]="isDisabled">I am disabled</button>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
title = 'Angular Property Binding Example';
isDisabled = true;
}
class binding
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
isActive = false;
toggleActive() {
this.isActive = !this.isActive;
}
}
<div [class.active]="isActive">This div is active.</div>
<button (click)="toggleActive()">Toggle Active</button>
.active {
background-color: yellow;
}
style binding
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
backgroundColor = 'red';
textColor = 'white';
}
<div [style.background-color]="backgroundColor">
<h1 [style.color]="textColor">Hello, world!</h1>
</div>
attribute binding
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
imageUrl = 'https://example.com/image.jpg';
imageAlt = 'Example image';
isButtonDisabled = false;
}
<img [attr.src]="imageUrl" [attr.alt]="imageAlt">
<button [attr.disabled]="isButtonDisabled">Click me</button>
b. From View to Component
Event binding - This allows for binding an event of an HTML element to a method in the component's class. It is denoted by parentheses (()).
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
onClick() {
console.log('Button was clicked');
}
}
<h1>Event Binding Example</h1>
<button (click)="onClick()">Click me</button>
Remeber💡
The (click) calls the specified function when a user clicks on the given element (in your example, when a user clicks on a row).
The (change) event binds to HTML's onChange event. This event is fired for `<input>`, `<select>`, and `<textarea>` elements when a change to the element's value is committed by the user.
The (change) event can also be specifically implemented by other Angular components. It is generally implemented on components where the contents of the component are changed by the user.
2. Two ways binding
This allows for binding a property of an HTML element to a property in the component's class and vice-versa. This is done by using a combination of property binding and event binding. It is denoted by [(ngModel)]
.
ngModel -
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
name: string = '';
}
<input [(ngModel)]="name" placeholder="Enter your name">
<p>Your name is: {{name}}</p>
Angular Directives
Directives add behaviour to an existing DOM element or an existing component instance.
Structural DIrectives -
ngFor -
<h1>ngFor Example</h1>
<ul>
<li *ngFor="let item of items">{{ item }}</li>
</ul>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
items = ['item 1', 'item 2', 'item 3'];
}
ngSwitch -
<h1>ngSwitch Example</h1>
<div [ngSwitch]="value">
<div *ngSwitchCase="1">Case 1</div>
<div *ngSwitchCase="2">Case 2</div>
<div *ngSwitchCase="3">Case 3</div>
<div *ngSwitchDefault>Default case</div>
</div>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
value = 1;
}
ngIf -
<h1>ngIf Example</h1>
<div *ngIf="showElement">
This element will only be displayed if showElement is true.
</div>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
showElement = true;
}
Attribute Directives
ngModel -
<h1>ngModel Example</h1>
<form>
<label for="name">Name:</label>
<input type="text" id="name" [(ngModel)]="name" name="name" />
</form>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
name: string;
}
ngClass -
<h1>ngClass Example</h1>
<div [ngClass]="{ highlighted: isHighlighted }">
This element will have the 'highlighted' class if isHighlighted is true.
</div>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
isHighlighted = true;
}
ngStyle -
<h1>ngStyle Example</h1>
<div [ngStyle]="{ color: color }">
This element will have the color style set to the value of the color property.
</div>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
color = 'red';
}
Custom Directives
<h1>Custom Directive Element</h1>
<div appCustomDirective>
This element will have a yellow background when the mouse is over it.
</div>
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
selector: '[appCustomDirective]',
})
export class CustomDirectiveDirective {
constructor(private el: ElementRef) {}
@HostListener('mouseenter') onMouseEnter() {
this.highlight('yellow');
}
@HostListener('mouseleave') onMouseLeave() {
this.highlight(null);
}
private highlight(color: string) {
this.el.nativeElement.style.backgroundColor = color;
}
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { CustomDirectiveDirective } from './custom-directive.directive';
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent, CustomDirectiveDirective],
bootstrap: [AppComponent],
})
export class AppModule {}
Pipes
A pipe takes in data as input and transforms it to a desired output.
Syntax
Expression | pipeOperator[:pipeArguments]
# Expression: is the expression, which you want to transform
# | : is the Pipe Character
# pipeOperator : name of the Pipe
# pipeArguments: arguments to the Pipe
Date Pipe
<h1>Date Pipe Example</h1>
<p>{{ date | date: 'shortDate' }}</p>
import { DatePipe } from '@angular/common';
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
date = new Date();
constructor(private datePipe: DatePipe) {}
formatDate() {
return this.datePipe.transform(this.date, 'shortDate');
}
}
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { DatePipe } from '@angular/common';
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
providers: [DatePipe],
})
export class AppModule {}
Uppercase Pipe
<h1>Upper Case Pipe Example</h1>
<p>{{ name | uppercase }}</p>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
name = 'Manthan Ank';
}
Lowercase Pipe
<p>{{ name | lowercase }}</p>
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
name = 'Manthan Ank';
}
Currency Pipe
<h1>Currency Pipe Example</h1>
<p>{{ price | currency }}</p>
import { CurrencyPipe } from '@angular/common';
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
price = 100;
constructor(private currencyPipe: CurrencyPipe) { }
formatCurrency() {
return this.currencyPipe.transform(this.price, 'USD', true);
}
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { CurrencyPipe } from '@angular/common';
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
providers: [CurrencyPipe],
})
export class AppModule {}
Percent Pipe
<h1>Percent Pipe Example</h1>
<p>{{ percentage | percent }}</p>
import { PercentPipe } from '@angular/common';
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
percentage = 0.5;
constructor(private percentPipe: PercentPipe) {}
formatPercentage() {
return this.percentPipe.transform(this.percentage, '2');
}
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { PercentPipe } from '@angular/common';
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
providers: [PercentPipe],
})
export class AppModule {}
Slice Pipe
<p>{{ ['apple', 'banana', 'orange', 'mango'] | slice:1:3 }}</p>
Decimal/number Pipe
<p>{{ 123456.78 | number:'3.2-3' }}</p>
Decorators
Decorators are design patterns used to isolate the modification or decoration of a class without modifying the source code.
Input -
import { Component, Input, OnInit } from '@angular/core';
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {
@Input() message: string;
constructor() { }
ngOnInit() {
}
}
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css'],
})
export class ParentComponent implements OnInit {
parentMessage = 'Hello from the parent component!';
constructor() {}
ngOnInit() {}
}
<p>{{ message }}</p>
<app-child [message]="parentMessage"></app-child>
<h1>@Input Example</h1>
<app-parent></app-parent>
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { RouterModule } from '@angular/router';
import { ChildComponent } from './child/child.component';
import { ParentComponent } from './parent/parent.component';
@NgModule({
imports: [BrowserModule, FormsModule, RouterModule],
declarations: [AppComponent, ChildComponent, ParentComponent],
bootstrap: [AppComponent],
})
export class AppModule {}
Output -
import { Component, EventEmitter, OnInit, Output } from '@angular/core';
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
styleUrls: ['./child.component.css'],
})
export class ChildComponent implements OnInit {
@Output() messageEvent = new EventEmitter<string>();
constructor() {}
ngOnInit() {}
sendMessage() {
this.messageEvent.emit('Hello from the child component!');
}
}
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css'],
})
export class ParentComponent implements OnInit {
constructor() {}
ngOnInit() {}
handleMessage(message: string) {
console.log(message);
}
}
<button (click)="sendMessage()">Send message</button>
<app-child (messageEvent)="handleMessage($event)"></app-child>
<h1>@Output Decorator Example</h1>
<app-parent></app-parent>
HostListener
<h1>@HostListener Decorator Example</h1>
<p>Click the host element to trigger the 'click' event.</p>
import { Component, HostListener } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
@HostListener('click')
onClick() {
console.log('The host element was clicked!');
}
}
contentChild & contentChildren
import {
Component,
ContentChild,
ContentChildren,
ElementRef,
OnInit,
QueryList,
} from '@angular/core';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css'],
})
export class ParentComponent implements OnInit {
@ContentChild('childButton1', { static: true }) childButton1: ElementRef;
@ContentChildren('childButton2') childButtons2: QueryList<ElementRef>;
ngAfterContentInit() {
console.log(this.childButton1.nativeElement.textContent);
this.childButtons2.forEach((button) => {
console.log(button.nativeElement.textContent);
});
}
constructor() {}
ngOnInit() {}
}
<ng-content></ng-content>
<h1>@ContentChild Decorator Example</h1>
<app-parent></app-parent>
viewChild & viewChildren
import { Component, ElementRef, QueryList, ViewChild, ViewChildren } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
@ViewChild('childButton1', { static: true }) childButton1: ElementRef;
@ViewChildren('childButton2') childButtons2: QueryList<ElementRef>;
ngAfterViewInit() {
console.log(this.childButton1.nativeElement.textContent);
this.childButtons2.forEach(button => {
console.log(button.nativeElement.textContent);
});
}
}
<h1>@viewChild & @viewChildren Example</h1>
<button #childButton1>Button 1</button>
<button #childButton2>Button 2</button>
Life Cycle Hooks
ngOnChanges - It is called when any data-bound property of a directive or component changes.
<form>
<input [(ngModel)]="message" name="message" />
<button type="submit" (click)="onSubmit()">Submit</button>
</form>
<p>{{ message }}</p>
import {
Component,
Input,
OnChanges,
OnInit,
SimpleChanges,
} from '@angular/core';
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.css'],
})
export class TestComponent implements OnChanges {
@Input() message: string;
prevMessage: string;
ngOnChanges(changes: SimpleChanges) {
if (changes.message) {
console.log(
`message changed from ${changes.message.previousValue} to ${changes.message.currentValue}`
);
}
}
onSubmit() {
this.prevMessage = this.message;
}
}
<app-test [message]="'Hello World'"></app-test>
ngOnInit - It is called after a component has been initialized and its data-bound properties have been checked for the first time.
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
constructor() {}
ngOnInit() {
console.log('logged from ngOnInit');
}
}
ngDoCheck - It is called during every change detection cycle. It allows a component to detect and act upon changes that Angular can't detect on its own.
import { Component, DoCheck } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements DoCheck {
ngDoCheck() {
console.log('ngDoCheck Called');
}
}
ngAfterViewInit - It is called after app has fully initialized a component's view.
import { AfterViewInit, Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewInit{
ngAfterViewInit(){
console.log("after view init")
}
clickMe(){
console.log("link clicked")
}
}
<a (click)="clickMe()">Click me</a>
ngAfterViewChecked - It is called after the default change detector has completed checking a component's view for changes.
import { AfterViewChecked, Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewChecked {
ngAfterViewChecked(){
console.log("after view checked")
}
clickMe(){
console.log("link clicked")
}
}
<a (click)="clickMe()">Click me</a>
ngAfterContentInit - It is called after Angular has fully initialized all content of a directive.
import { AfterContentInit, Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterContentInit {
ngAfterContentInit() {
console.log('after content init');
}
clickMe() {
console.log('clicked');
}
}
<a (click)="clickMe()">Click me</a>
ngAfterContentChecked - It is called after the default change detector has completed checking all content of a directive.
import { AfterContentInit, Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterContentInit {
ngAfterContentChecked() {
console.log('after content init');
}
clickMe() {
console.log('clicked');
}
}
<a (click)="clickMe()">Click me</a>
ngOnDestroy - It is called just before a component or directive is destroyed. It is a good place to clean up any subscriptions or detach any event handlers to avoid memory leaks.
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { of } from 'rxjs';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit, OnDestroy {
private subscription: Subscription;
ngOnInit() {
const someObservable = of(1, 2, 3);
this.subscription = someObservable.subscribe((data) => {
console.log(data);
});
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
Forms
Template Driven Form
<form (ngSubmit)="onSubmit()" #form="ngForm">
<input [(ngModel)]="name" name="name" required>
<button type="submit">Submit</button>
</form>
Example
<!-- form template -->
<form (ngSubmit)="onSubmit(form)" #form="ngForm">
<label>
Name:
<input type="text" [(ngModel)]="name" name="name" required>
</label>
<br>
<label>
Email:
<input type="email" [(ngModel)]="email" name="email" required>
</label>
<br>
<button type="submit" [disabled]="!form.valid">Submit</button>
</form>
import { Component } from '@angular/core';
import { NgForm } from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
name: string;
email: string;
onSubmit(form: NgForm) {
console.log(form.value); // { name: 'your name', email: 'your email' }
console.log(form.valid); // true
}
}
Reactive Form
Basic Form Control
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [
// other imports ...
ReactiveFormsModule
],
})
export class AppModule { }
import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';
@Component({
selector: 'app-name-editor',
templateUrl: './name-editor.component.html',
styleUrls: ['./name-editor.component.css']
})
export class NameEditorComponent {
name = new FormControl('');
}
<label for="name">Name: </label>
<input id="name" type="text" [formControl]="name">
To display form control values
{{ name.value }}
To replace the form control value
<button (click)="update()">Update</button>
update(){
this.name.setValue('Manthan');
}
Form Group
import { Component } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'app-profile-editor',
templateUrl: './profile-editor.component.html',
styleUrls: ['./profile-editor.component.css']
})
export class ProfileEditorComponent {
profileForm = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl(''),
});
}
<form [formGroup]="profileForm" (ngSubmit)="onSubmit()">
<div>
<label for="first-name">First Name: </label>
<input id="first-name" type="text" formControlName="firstName">
</div>
<div>
<label for="last-name">Last Name: </label>
<input id="last-name" type="text" formControlName="lastName">
</div>
</form>
<p>Complete the form to enable button.</p>
<button type="submit" [disabled]="!profileForm.valid">Submit</button>
Nested form groups
import { Component } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'app-profile-editor',
templateUrl: './profile-editor.component.html',
styleUrls: ['./profile-editor.component.css']
})
export class ProfileEditorComponent {
profileForm = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl(''),
address: new FormGroup({
street: new FormControl(''),
city: new FormControl(''),
state: new FormControl(''),
zip: new FormControl('')
})
});
}
<div formGroupName="address">
<h2>Address</h2>
<label for="street">Street: </label>
<input id="street" type="text" formControlName="street">
<label for="city">City: </label>
<input id="city" type="text" formControlName="city">
<label for="state">State: </label>
<input id="state" type="text" formControlName="state">
<label for="zip">Zip Code: </label>
<input id="zip" type="text" formControlName="zip">
</div>
Form Data
Control State, Validity, and Error Messages
Form and Data Model
FormArrays
HTTP
Import HttpClient Module in Root Module -
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
@NgModule({
declarations: [
AppComponent
],
imports: [
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Import Required Module in Component/Service -
import { HttpClient } from '@angular/common/http';
Inject HttpClient service -
constructor(public http: HttpClient) {
}
HTTP GET
getData(){
return this.http.get('url');
}
HTTP POST
sendData(data: any){
return this.http.post('url', data);
}
HTTP PUT
updateData(data: any){
return this.http.put('url', data);
}
HTTP PATCH
updateData(data: any){
return this.http.patch('url', data);
}
HTTP DELETE
deleteData(id: string){
return this.http.delete(`url/${id}`);
}
HTTP Interceptor
Http Interceptors are part of @angular/common/http, which inspect and transform HTTP requests from your application to the server and vice-versa on HTTP responses. These interceptors can perform a variety of implicit tasks, from authentication to logging.
Using Observable
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class MyService {
constructor(private http: HttpClient) {}
getData(): Observable<any> {
return this.http.get<any>('utl');
}
sendData(data: any): Observable<any> {
return this.http.post<any>('utl', data);
}
updateData(data: any): Observable<any> {
return this.http.put<any>('utl', data);
}
updateData(data: any): Observable<any> {
return this.http.patch<any>('utl', data);
}
deleteData(id: string): Observable<any> {
return this.http.delete<any>(`utl/${id}`);
}
}
Options—Headers/Params
Options—Observe/Response Type
Module
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
@NgModule({
imports: [BrowserModule, FormsModule, AppRoutingModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
})
export class AppModule {}
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { Page1Component } from './page-1/page-1.component';
import { Page2Component } from './page-2/page-2.component';
const routes: Routes = [
{ path: 'page-1', component: Page1Component },
{ path: 'page-2', component: Page2Component },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule {}
<h1>Routing Example</h1>
<a routerLink="page-1">Page-1</a>
<a routerLink="page-2">Page2-</a>
<router-outlet></router-outlet>
Lazy loading
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
@NgModule({
imports: [BrowserModule, FormsModule, AppRoutingModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
})
export class AppModule {}
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [
{
path: 'page-1',
loadChildren: () =>
import('./page-1/page-1.module').then((m) => m.Page1Module),
},
{
path: 'page-2',
loadChildren: () =>
import('./page-2/page-2.module').then((m) => m.Page2Module),
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule {}
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { Page1Component } from './page-1.component';
const routes: Routes = [
{
path: '',
component: Page1Component,
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class Page1RoutingModule {}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Page1Component } from './page-1.component';
import { Page1RoutingModule } from './page-1-routing.module';
@NgModule({
imports: [CommonModule, Page1RoutingModule],
declarations: [Page1Component],
})
export class Page1Module {}
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { Page2Component } from './page-2.component';
const routes: Routes = [
{
path: '',
component: Page2Component,
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class Page2RoutingModule {}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Page2Component } from './page-2.component';
import { Page2RoutingModule } from './page-2-routing.module';
@NgModule({
imports: [CommonModule, Page2RoutingModule],
declarations: [Page2Component],
})
export class Page2Module {}
<h1>Lazy Loading Example</h1>
<a routerLink="page-1">Page-1</a>
<a routerLink="page-2">Page-2</a>
<router-outlet></router-outlet>
Router
Angular Router is a mechanism in which navigation happens from one view to the next as users perform application tasks. It borrows the concepts or model of browser's application navigation.
Required Route Params
Navigating in app
Optional Route Params
Params
Services & Dependency Injection
Services -
A service is used when a common functionality needs to be provided to various modules. Services allow for greater separation of concerns for your application and better modularity by allowing you to extract common functionality out of components.
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class SharedService {
constructor() { }
}
Dependency Injection -
Dependency injection (DI), is an important application design pattern in which a class asks for dependencies from external sources rather than creating them itself.
Routing Module
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, AppRoutingModule],
bootstrap: [AppComponent],
})
export class AppModule { }
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CommonModule } from '@angular/common';
import { HomeComponent } from './home.component';
@NgModule({
declarations: [HomeComponent],
imports: [
CommonModule,
],
providers: [],
})
export class HomeModule { }
Routing Module -
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Observables in Angular
An observable is a class that can be used to handle asynchronous data streams. Observables are used to handle data that can arrive over time, such as data received from a server, user input, or timed events.
Standalone Components
A standalone component is a type of component which is not part of any Angular module. It provides a simplified way to build Angular applications.
JIT
Just-in-Time (JIT) is a type of compilation that compiles your app in the browser at runtime.
AOT
Ahead-of-Time (AOT) is a type of compilation that compiles your app at build time.
JIT vs AOT
Route Guards
CanActivate
import { Injectable } from '@angular/core';
import {
CanActivate,
ActivatedRouteSnapshot,
RouterStateSnapshot,
} from '@angular/router';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
return false;
}
}
CanDeactivate
Resolve
CanLoad
CanActivateChild
API/Server Calls and CORS
Different Environments
Caching
Production Build
Base Href
ng-container - A special element that can hold structural directives without adding new elements to the DOM.
<ng-container>
......
</ng-container>
Angular Universal
Angular Universal is a server-side rendering module for Angular applications in various scenarios. This is a community driven project and available under @angular/platform-server package.
// create the application
ng add @nguniversal/express-engine
//run the application
npm run dev:ssr
Angular Animations
Angular's animation system is built on CSS functionality in order to animate any property that the browser considers animatable. These properties includes positions, sizes, transforms, colors, borders etc. The Angular modules for animations are @angular/animations and @angular/platform-browser.
Deploying an Angular Application
CLI Commands
Installing Angular CLI
npm install -g @angular/cli
Help
ng help
Check version
ng version
Create, build, and serve a new, basic Angular project cli command
ng new my-first-project
cd my-first-project
ng serve
Generating new application
ng new app-name
Create new app without installing cli
npm init @angular app-name
Component
ng g c component-name
ng generate component component-name
Adding External libraries
ng add
Build
ng build
Running project
ng serve
Run project on particular port
ng serve --port=portname
// example
ng serve --port=3000
Run project and open the url in default browser
ng serve --open
Update
ng update
Directive
ng generate directive component-name
ng g directive component-name
Module
ng generate module module-name
ng g m module-name
Service
ng generate service component-name
ng g service component-name
Routing Module
ng g module module-name --routing
ng g m module-name --routing
Component with module, routing module
ng generate module component-name --route component-name --module app.module
Pipe
ng g pipe pipe-name
Enum
ng g enum some-enum
Class
ng g cl my-class
Interface
ng g interface my-interface
Guard
ng g guard guard-name
Multiple Projects in one Angular App
ng generate application sub-app-name
ng new app-name --create-application=false
Generate environments
ng generate environments
Imports
HttpCientModule
import { HttpCientModule } from '@angular/common/http';
FormsModule
import { FormsModule } from '@angular/forms';
ReactiveFormsModule
import { ReactiveFormsModule } from '@angular/forms';
RxJS
import { } from 'rxjs';
Firebase
import { AngularFireModule } from "@angular/fire/compat";
import { AngularFireAuthModule } from "@angular/fire/compat/auth";
import { AngularFireStorageModule } from '@angular/fire/compat/storage';
import { AngularFirestoreModule } from '@angular/fire/compat/firestore';
import { AngularFireDatabaseModule } from '@angular/fire/compat/database';
import { AngularFireStorage } from '@angular/fire/storage';
Learn more from GitHub Repositories
- Awesomw Angular
- Angular JumpStart
- Angular Interview Questions by Sudheerj
- Angular Learning Resources
- CodAffection
- Bezkoder
- Angular Interview Questions by Yonet
Learn more from Websites
- Official Documentation
- Tektutorialshub
- W3School
- GeeksForGeeks
- DevDocs
- Freecodecamp
- Javatpoint
- Tutorialspoint
- Udemy
- YouTube
- Stackoverflow
- NX Blog
- Indepthdev
- Angular University
- Bezkoder
Learn more from Books
- Angular From Theory To Practice
- Angular in Action
- Ng-Book: The Complete Guide to Angular
- Pro Angular 6
- Beginning Angular with Typescript
- Angular 6 for Enterprise-Ready Web Applications
- ASP.NET Core 2 and Angular 5
- Angular Up & Running
- Codecraft
- Rangle.io
- Angular 2 Succinctly
- Angular2Book
- Learning Angular: A no-nonsense guide to building web applications with Angular 15, 4th Edition
Learn from YouTube Channels
- Freecodecamp
- Programming With Mosh
- Traversy Media
- Code With Harry
- Fireship
- Academind
- Decoded Frontend
- Brandon Roberts
- ARC Tutorials
- Edureka
- Simplilearn
- Joshua Morony
- Codevolution
- Code Step By Step
- UX Trendz
- Devstackr
- David Acosta
- Testy Codiez
- CodAffection
Learn More From Blogs Sites
List of Online Editors/Compiler
List of Twitter Users
List of LinkedIn Users
- Kevin Kreuzer
- Aristeidis Bampakos
- Dmytro Mezhenskyi
- Santosh Yadav
- Tomas Trajan
- Marko Stanimirović
- Teja Gandhamu
🙏🏻Please Support and Don't Forget to give star⭐, Also Feel free to contribute
1 year ago