Angular
Angular
Back in the day, web developers used VanillaJS and jQuery to develop dynamic websites
but, as the logic of one's website grew, the code became more and more tedious to
maintain. For applications that use complex logic, developers had to put in extra effort to
maintain separation of concerns for the app. Also, jQuery did not provide facilities for
data handling across views.
For tackling the above problems, client-side frameworks like Angular came into the
picture, which made life easier for the developers by handling separation of concerns and
dividing code into smaller bits of information (In the case of Angular, called
Components).
Client-side frameworks allow one to develop advanced web applications like Single-
Page-Application. Not that we cannot develop SPAs using VanillaJS, but by doing so, the
development process becomes slower.
Every Angular app consists of a file named angular.json. This file will contain all the
configurations of the app. While building the app, the builder looks at this file to find the
entry point of the application. Following is an image of the angular.json file:
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/angular-starter",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
"aot": false,
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
"src/style.css"
]
}
}
Inside the build section, the main property of the options object defines the entry point of
the application which in this case is main.ts.
The main.ts file creates a browser environment for the application to run, and, along with
this, it also calls a function called bootstrapModule, which bootstraps the application.
These two steps are performed in the following order inside the main.ts file:
platformBrowserDynamic().bootstrapModule(AppModule)
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [],
entryComponents: [],
bootstrap: [AppComponent]
})
export class AppModule { }
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'angular';
}
Each component is declared with three properties:
1. Selector - used for accessing the component
2. Template/TemplateURL - contains HTML of the component
3. StylesURL - contains component-specific stylesheets
After this, Angular calls the index.html file. This file consequently calls the root
component that is app-root. The root component is defined in app.component.ts.
This is how the index.html file looks:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Angular</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-
scale=1">
</head>
<body>
<app-root></app-root>
</body>
</html>
The HTML template of the root component is displayed inside the <app-root> tags.
Features that are provided out of the box - Angular provides a number of built-in
features like,routing, state management, rxjs library and http servicesstraight out of the
box. This means that one does not need tolook for the above stated features separately.
They are allprovided with angular.
Declarative UI - Angular uses HTML to render the UI of an application. HTML isa
declarative language and is much easier to use than JavaScript.
Long-term Google support - Google announced Long-term support for Angular.
This means that Google plans to stick with Angular and further scale up its ecosystem.
Architecture
AngularJS uses MVC or Model-View-Controller architecture, where the Model contains
the business logic, Controller processes information and View shows the information
present in the Model.
Angular replaces controllers with Components. Components are nothing but directives
with a predefined template.
Language
Mobile Support
Structure
While developing larger applications, the process of maintaining code becomes tedious in
the case of AngularJS.
In the case of Angular, it is easier to maintain code for larger applications as it provides a
better structure.
Expression Syntax
Every Angular application consists of components and templates which the browser
cannot understand. Therefore, all the Angular applications need to be compiled first
before running inside the browser.
JIT(Just-in-Time) compilation
AOT(Ahead-of-Time) compilation
In JIT compilation, the application compiles inside the browser during runtime.
Whereas in the AOT compilation, the application compiles during the build time.
By default, angular builds and serves the application using JIT compiler:
ng build
ng serve
ng build --aot
ng serve --aot
For better understanding, I would like you to create an Angular application by running
the following inside the command terminal:
ng new angularApp
Components
In Angular, components are the basic building blocks, which control a part of the UI for
any application.
A component is defined using the @Component decorator. Every component consists of
three parts, the template which loads the view for the component, a stylesheet which
defines the look and feel for the component, and a class that contains the business logic
for the component.
For creating a component, inside the command terminal, navigate to the directory of the
application created, and run the following command:
Or
ng g c test
One can see the generated component inside src/app/test folder. The component will be
defined inside test.component.ts and this is how it looks:
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.css']
})
export lass TestComponent implements OnInit {
constructor() {}
ngOnInit() {
}
}
As we can see in the above image, our component is defined with @Component
decorator.
Modules
A module is a place where we can group components, directives, services, and pipes.
Module decides whether the components, directives, etc can be used by other modules,
by exporting or hiding these elements. Every module is defined with a @NgModule
decorator.
By default, modules are of two types:
Root Module
Feature Module Every application can have only one root module whereas, it can have
one or more feature modules.
A root module imports BrowserModule, whereas a feature module imports
CommonModule.
In the application that we created before, one can see that the root module is defined
inside app.module.ts and this is how it looks:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
@NgModule({
declarations: [
AppComponent,
TestComponent
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
We can see in the above image that the component we created earlier is already imported
in the declarations array.
ng g m test-module
@NgModule({
declarations: [],
imports: [
CommonModule
]
})
export class TestModuleModule { }
Services Services are objects which get instantiated only once during the lifetime of an
application. The main objective of a service is to share data, functions with different
components of an Angular application.
A service is defined using a @Injectable decorator. A function defined inside a service
can be invoked from any component or directive.
ng g s test-service
@Injectable({
providedIn: 'root'
})
export class TestServiceService {
constructor() { }
Any method/function defined inside the TestServiceService class can be directly used
inside any component by just importing the service.
ngOnChanges( ) This hook/method is called before ngOnInit and whenever one or more
input properties of the component changes.
This method/hook receives a SimpleChanges object which contains the previous and
current values of the property.
ngOnInit( ) This hook gets called once, after the ngOnChanges hook.
It initializes the component and sets the input properties of the component.
ngDoCheck( ) It gets called after ngOnChanges and ngOnInit and is used to detect and
act on changes that cannot be detected by Angular.
We can implement our change detection algorithm in this hook. ngAfterContentInit( ) It
gets called after the first ngDoCheck hook. This hook responds after the content gets
projected inside the component.
Let’s understand how to use ngOnInit hook, since it’s the most oftenly used hook. If one
has to process lot of data during component creation, it’s better to do it inside ngOnInit
hook rather than the constructor:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.css']
})
export class TestComponent implements OnInit {
constructor() { }
ngOnInit() {
this.processData();
}
processData(){
// Do something..
}
As you can see we have imported OnInit but we have used ngOnInit function. This
principle should be used with the rest of the hooks as well.
String interpolation and property binding allow only one-way data binding.
String interpolation uses the double curly braces {{ }} to display data from the
component. Angular automatically runs the expression written inside the curly braces, for
example, {{ 2 + 2 }} will be evaluated by Angular and the output 4, will be displayed
inside the HTML template. Using property binding, we can bind the DOM properties of
an HTML element to a component's property. Property binding uses the square brackets [
] syntax.
9. How are Angular expressions different from JavaScript expressions?
The first and perhaps, the biggest difference is that Angular expressions allow us to write
JavaScript in HTML which is not the case when it comes to JavaScript expressions.
Next, Angular expressions are evaluated against a local scope object whereas JavaScript
expressions against global window object. Let's understand that better with an example :
@Component({
selector: 'app-test',
template: `
<h4>{{message}}</h4>
`,
styleUrls: ['./test.component.css']
})
export class TestComponent implements OnInit {
message:string = “Hello world”;
constructor() { }
ngOnInit() {
}
}
As one can see that Angular expression is used to display message property of a
component. Since we are using Angular expressions, in the present template, we cannot
access a property outside of its local scope, which in this case is TestComponent.
This proves that Angular expressions are always evaluated based on scope object rather
than the global object.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-
scale=1.0">
<title>JavaScript Test</title>
</head>
<body>
<div id="foo"><div>
</body>
<script>
'use strict';
let bar = {};
document.getElementById('foo').innerHTML = bar.x;
</script>
</html>
If you run the above code, you will see undefined displayed on the screen. Although it’s
not ideal to leave any property undefined, the user does not need to see this.
Now consider the following Angular example:
@Component({
selector: 'app-new',
template: `
<h4>{{message}}</h4>
`,
styleUrls: ['./new.component.css']
})
export class NewComponent implements OnInit {
message:object = {};
constructor() { }
ngOnInit() {
}
If you render the above component, you will not see undefined being displayed on the
screen.
Next, in Angular expressions one cannot use loops, conditionals and exceptions.
The difference which makes Angular expressions quite beneficial is the use of pipes.
Angular uses pipes(called filters in AngularJS), which can be used to format data before
displaying it. Let’s see one predefined pipe in action:
@Component({
selector: 'app-new',
template: `
<h4>{{message | lowercase}}</h4>
`,
styleUrls: ['./new.component.css']
})
export class NewComponent implements OnInit {
message:string = "HELLO WORLD";
constructor() { }
ngOnInit() {
}
In the above code we have used a predefined pipe called lowercase, which transforms all
the letters in lowercase. Therefore, if you render the above component, you will see
“hello world” being displayed.
Promise Observable
Emits a single value Emits multiple values over a period of time
Lazy. An observable is not called until we
Not Lazy
subscribe to the observable
Can be cancelled by using the unsubscribe()
Cannot be cancelled
method
Observable provides operators like map,
forEach, filter, reduce, retry, retryWhen etc.
observable.subscribe((message)=> console.log(message));
When you run the above Observable, you can see messages being displayed in the
following order:
Running the above promise, the messages will be displayed in the following order:
As you can see the message inside Promise is displayed first. This means that a promise
runs before the then method is called. Therefore, promises are eager.
The next difference is that Promises are always asynchronous. Even when the promise is
immediately resolved. Whereas an Observable, can be both synchronous and
asynchronous.
observable.subscribe((data)=> console.log(data));
The next difference is that Observables can emit multiple values whereas Promises can
emit only one value.
The biggest feature of using observables is the use of operators. We can use multiple
operators on an observable whereas, there is no such feature in a promise.
First time users can instantly see a view of the application. This benefits in providing
better user experience.
Many search engines expect pages in plain HTML, thus, Universal can make sure that
your content is available on every search engine, which leads to better SEO.
Any server-side rendered application loads faster since rendered pages are available
to the browser sooner.
Types of directives
Component directives
These form the main class in directives. Instead of @Directive decorator we use
@Component decorator to declare these directives. These directives have a view, a
stylesheet and a selector property.
Structural directives
These directives are generally used to manipulate DOM elements.
Every structural directive has a ‘ * ’ sign before them.
We can apply these directives to any DOM element.
In the above example, we can *ngIf and *ngFor directives being used.
*ngIf is used to check a boolean value and if it’s truthy,the div element will be displayed.
*ngFor is used to iterate over a list and display each item of the list.
Attribute Directives
These directives are used to change the look and behaviour of a DOM element. Let’s
understand attribute directives by creating one:
In the command terminal, navigate to the directory of the angular app and type the
following command to generate a directive:
ng g directive blueBackground
The following directive will be generated. Manipulate the directive to look like this:
@Directive({
selector: '[appBlueBackground]'
})
export class BlueBackgroundDirective {
constructor(el:ElementRef) {
el.nativeElement.style.backgroundColor = "blue";
}
}
Following are the commonly used methods by which one can pass data between
components in angular:
In the above parent component, we are passing “data” property to the following child
component:
@Component({
selector: 'app-child',
template:`
<p>{{data}}</p>
`,
styleUrls: ['./child.component.css']
})
export class ChildComponent {
@Input() data:string
constructor() { }
}
In the child component, we are using @Input decorator to capture data coming from a
parent component and using it inside the child component’s template.
Child to parent using @ViewChild decorator
Child component:
import {Component} from '@angular/core';
@Component({
selector: 'app-child',
template:`
<p>{{data}}</p>
`,
styleUrls: ['./child.component.css']
})
export class ChildComponent {
data:string = "Message from child to parent";
constructor() { }
}
Parent Component
@Component({
selector: 'app-parent',
template: `
<p>{{dataFromChild}}</p>
` ,
styleUrls: ['./parent.component.css']
})
export class ParentComponent implements AfterViewInit {
dataFromChild: string;
@ViewChild(ChildComponent,{static:false}) child;
ngAfterViewInit(){
this.dataFromChild = this.child.data;
}
constructor() { }
}
In the above example, a property named “data” is passed from the child component to the
parent component.
@ViewChild decorator is used to reference the child component as “child” property.
Using the ngAfterViewInit hook, we assign the child’s data property to the
messageFromChild property and use it in the parent component’s template.
Child Component:
@Component({
selector: 'app-child',
template:`
<button (click)="emitData()">Click to emit data</button>
`,
styleUrls: ['./child.component.css']
})
export class ChildComponent {
constructor() { }
emitData(){
this.dataEvent.emit(this.data);
}
}
As you can see in the child component, we have used @Output property to bind an
EventEmitter. This event emitter emits data when the button in the template is clicked.
In the parent component’s template we can capture the emitted data like this:
<app-child (dataEvent)="receiveData($event)"></app-child>
Then inside the receiveData function we can handle the emitted data:
receiveData($event){
this.dataFromChild = $event;
}
ng g service test
@Injectable({
providedIn: 'root'
})
export class TestService {
importantValue:number = 42;
constructor() { }
returnImportantValue(){
return this.importantValue;
}
}
As one can notice, we can create injectable dependencies by adding the @Injectable
decorator to a class.
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.css']
})
export class TestComponent implements OnInit {
value:number;
constructor(private testService:TestService) { }
ngOnInit() {
this.value = this.testService.returnImportantValue();
}
}
One can see we have imported our TestService at the top of the page. Then, we have
created an instance inside the constructor of the component and implemented the
returnImportantValue function of the service.
From the above example, we can observe how angular provides a smooth way to inject
dependencies in any component.
1. Model
2. View
3. ViewModel
Model contains the structure of an entity. In simple terms it contains data of an object.
View is the visual layer of the application. It displays the data contained inside the
Model. In angular terms, this will be the HTML template of a component.
ViewModel is an abstract layer of the application. A viewmodel handles the logic of the
application. It manages the data of a model and displays it in the view.
View and ViewModel are connected with data-binding (two-way data-binding in this
case). Any change in the view, the viewmodel takes a note and changes the appropriate
data inside the model.
Question: What is Angular?
Client-side frameworks permit the development of advanced web applications like SPAs
which, if developed by VanillaJS, is a slower process.
Answer: Conventional HTML elements have some content between the tags. For
instance:
Now consider the following example of having custom text between angular tags:
However, doing so won’t work the way it worked for HTML elements. In order to make
it work just like the HTML example mentioned above, we need to use the ng-content
Directive. Moreover, it is helpful in building reusable components.
Answer: There are several features of Angular that make it an ideal front end JavaScript
framework. Most important of them are described as follows:
Accessibility Applications
Angular allows creating accessible applications using ARIA-enabled components, built-
in a11y test infrastructure, and developer guides.
Angular CLI
Angular provides support for command-line interface tools. These tools can be used for
adding components, testing, instant deploying, etc.
Animation Support
Angular can be used for building an efficient and powerful desktop, native, and
progressive web apps. Angular provides support for building native mobile applications
using Cordova, Ionic, or NativeScript.
Angular allows creating high performance, offline, and zero-step installation progressive
web apps using modern web platform capabilities. The popular JS framework can also be
used for building desktop apps for Linux, macOS, and Windows.
Code Generation
Angular is able to convert templates into highly-optimized code for modern JavaScript
virtual machines.
Code Splitting
With the new Component Router, Angular apps load quickly. The Component Router
offers automatic code-splitting so that only the code required to render the view that is
requested by a user is loaded.
Angular offers code completion, instant errors, etc. with popular source code editors and
IDEs.
Templates
Testing
Angular lets you carry out frequent unit tests using Karma. The Protractor allows running
faster scenario tests in a stable way.
Answer:
Out of box Features: Several built-in features like routing, state management, rxjs
library, and HTTP services are straight out of the box services provided by Angular. So,
one does not need to look for the above-stated features separately.
Long-term Google Support: Google plans to stick with Angular and further scale up its
ecosystem as it has offered its long term support to Angular.
Answer:
A developer needs to remember the correct Property binding is done using "[ ]"
Expression
ng-directive for binding an event or a attribute and event binding is done
Syntax
property. using "( )" attribute.
Routing AngularJS uses $routeprovider.when() Angular uses @RouteConfig{(…)}
Question: What are Lifecycle hooks in Angular? Explain some life cycles hooks
Answer: Angular components enter its lifecycle from the time it is created to the time it
is destroyed. Angular hooks provide ways to tap into these phases and trigger changes at
specific phases in a lifecycle.
ngOnChanges( ): This method is called whenever one or more input properties of the
component changes. The hook receives a SimpleChanges object containing the previous
and current values of the property.
ngOnInit( ): This hook gets called once, after the ngOnChanges hook.
It initializes the component and sets the input properties of the component.
ngDoCheck( ): It gets called after ngOnChanges and ngOnInit and is used to detect and
act on changes that cannot be detected by Angular.
ngAfterContentInit( ): It gets called after the first ngDoCheck hook. This hook responds
after the content gets projected inside the component.
Better User Experience: Allows users to see the view of the application instantly.
Better SEO: Universal ensures that the content is available on every search engine
leading to better SEO.
Loads Faster: Render pages are available to the browsers sooner, so the server-side
application loads faster.
Let us understand in a detailed manner. Dependencies in Angular are services which have
a functionality. Various components and directives in an application can need these
functionalities of the service. Angular provides a smooth mechanism by which these
dependencies are injected into components and directives.
Answer: MVVM architecture removes tight coupling between each component. The
MVVM architecture comprises of three parts:
Model
View
ViewModel
The architecture allows the children to have reference through observables and not
directly to their parents.
Model: It represents the data and the business logic of an application, or we may say it
contains the structure of an entity. It consists of the business logic - local and remote
data source, model classes, repository.
View: View is a visual layer of the application, and so consists of the UI Code(in Angular-
HTML template of a component.). It sends the user action to the ViewModel but does
not get the response back directly. It has to subscribe to the observables which
ViewModel exposes to it to get the response.
ViewModel: It is an abstract layer of the application and acts as a bridge between the
View and Model(business logic). It does not have any clue which View has to use it as it
does not have a direct reference to the View. View and ViewModel are connected with
data-binding so, any change in the View the ViewModel takes note and changes the
data inside the Model. It interacts with the Model and exposes the observable that can
be observed by the View.
Fast Rendering: The browser loads the executable code and renders it immediately as
the application is compiled before running inside the browser.
Fewer Ajax Requests: The compiler sends the external HTML and CSS files along with
the application, eliminating AJAX requests for those source files.
Minimizing Errors: Easy to detect and handle errors during the building phase.
Better Security: Before an application runs inside the browser, the AOT compiler adds
HTML and templates into the JS files, so there are no extra HTML files to be read, thus
providing better security for the application.
Answer: Singleton objects in Angular that get instantiated only once during the lifetime
of an application are called services. An Angular service contains methods that maintain
the data throughout the life of an application.
The primary intent of an Angular service is to organize as well as share business logic,
models, or data and functions with various components of an Angular application.
The functions offered by an Angular service can be invoked from any Angular
component, such as a controller or directive.
Complex SPAs can be inconvenient and laggy to use due to their size
Dynamic applications do not always perform well
Learning Angular requires a decent effort and time
Question: Enumerate some salient features of Angular 7.
Answer: Unlike the previous versions of Angular, the 7th major release comes with
splitting in @angular/core. This is done in order to reduce the size of the same. Typically,
not each and every module is required by an Angular developer. Therefore, in Angular 7
each split of the @angular/core will have no more than 418 modules.
Also, Angular 7 brings drag-and-drop and virtual scrolling into play. The latter enables
loading as well as unloading elements from the DOM. For virtual scrolling, the latest
version of Angular comes with the package. Furthermore, Angular 7 comes with a new
and enhanced version of the ng-compiler.
The JavaScript expressions that are to be executed by Angular are added within the curly
braces and the corresponding output is embedded into the HTML code. Typically, these
expressions are updated and registered like watches as a part of the digest cycle.
Answer: The user login credentials are passed to an authenticate API, which is present on
the server. Post server-side validation of the credentials, a JWT (JSON Web Token) is
returned. The JWT has information or attributes regarding the current user. The user is
then identified with the given JWT. This is called authentication.
Post logging-in successfully, different users have a different level of access. While some
may access everything, access for others might be restricted to only some resources. The
level of access is authorization.
Answer: Angular organizes the $scope objects into a hierarchy that is typically used by
views. This is known as the scope hierarchy in Angular. It has a root scope that can
further contain one or several scopes called child scopes.
In a scope hierarchy, each view has its own $scope. Hence, the variables set by a view’s
view controller will remain hidden to other view controllers. Following is a typical
representation of a Scope Hierarchy:
Root $scope
o $scope for Controller 1
o $scope for Controller 2
o …
o ..
o .
o $scope for Controller n
Answer:
Answer: Following are the various notable differences between Angular and Backbone.js
Architecture
Backbone.js makes use of the MVP architecture and doesn’t offer any data binding
process. Angular, on the contrary, works on the MVC architecture and makes use of two-
way data binding for driving application activity.
Community Support
Being backed by Google greatly ups the community support received by the Angular
framework. Also, extensive documentation is available. Although Backbone.js has a good
level of community support, it only documents on Underscore.js templates, not much
else.
Data Binding
Angular uses two-way data binding process and thus is a bit complex. Backbone.js, on
the contrary, doesn’t have any data binding process and thus, has a simplistic API.
DOM
The prime focus of Angular JS is upon valid HTML and dynamic elements that imitate
the underlying data for rebuilding the DOM as per the specified rules and then works on
the updated data records.
Backbone.js follows the direct DOM manipulation approach for representing data and
application architecture changes.
Performance
Backbone.js has a significant upper hand in performance over Angular in small data sets
or small webpages. However, it is not recommended for larger webpages or large data
sets due to the absence of any data binding process.
Templating
Angular supports templating via dynamic HTML attributes. These are added to the
document to develop an easy to understand application at a functional level. Unlike
Angular, Backbone.js uses Underscore.js templates that aren’t fully-featured as Angular
templates.
The approach to testing varies greatly between Angular and Backbone.js due to the fact
that while the former is preferred for building large applications the latter is ideal for
developing smaller webpages or applications.
For Angular, unit testing is preferred and the testing process is smoother through the
framework. In the case of Backbone.js, the absence of a data binding process allows for a
swift testing experience for a single page and small applications.
Type
Answer: As soon as a promise is made, the execution takes place. However, this is not
the case with observables because they are lazy. This means that nothing happens until a
subscription is made. While promises handle a single event, observable is a stream that
allows passing of more than one event. A callback is made for each event in an
observable.
Answer: Various differences between Angular and AngularJS are stated as follows:
Answer: Directives. The image represents the types of directives in Angular; Attribute,
structural, and custom.
Answer: In Angular, annotations are used for creating an annotation array. They are only
metadata set of the class using the Reflect Metadata library.
Decorators in Angular are design patterns used for separating decoration or modification
of some class without changing the original source code.
Answer: Directives are one of the core features of Angular. They allow an Angular
developer to write new, application-specific HTML syntax. In actual, directives are
functions that are executed by the Angular compiler when the same finds them in the
DOM. Directives are of three types:
Attribute Directives
Component Directives
Structural Directives
Answer: There are essentially 9 building blocks of an Angular application. These are:
1. Components – A component controls one or more views. Each view is some specific
section of the screen. Every Angular application has at least one component, known as
the root component. It is bootstrapped inside the main module, known as the root
module. A component contains application logic defined inside a class. This class is
responsible for interacting with the view via an API of properties and methods.
2. Data Binding – The mechanism by which parts of a template coordinates with parts of a
component is known as data binding. In order to let Angular know how to connect both
sides (template and its component), the binding markup is added to the template HTML.
3. Dependency Injection (DI) – Angular makes use of DI to provide required dependencies
to new components. Typically, dependencies required by a component are services. A
component’s constructor parameters tell Angular about the services that a component
requires. So, a dependency injection offers a way to supply fully-formed dependencies
required by a new instance of a class.
4. Directives – The templates used by Angular are dynamic in nature. Directives are
responsible for instructing Angular about how to transform the DOM when rendering a
template. Actually, components are directives with a template. Other types of directives
are attribute and structural directives.
5. Metadata – In order to let Angular know how to process a class, metadata is attached to
the class. For doing so decorators are used.
6. Modules – Also known as NgModules, a module is an organized block of code with a
specific set of capabilities. It has a specific application domain or a workflow. Like
components, any Angular application has at least one module. This is known as the root
module. Typically, an Angular application has several modules.
7. Routing – An Angular router is responsible for interpreting a browser URL as an
instruction to navigate to a client-generated view. The router is bound to links on a page
to tell Angular to navigate the application view when a user clicks on it.
8. Services – A very broad category, a service can be anything ranging from a value and
function to a feature that is required by an Angular app. Technically, a service is a class
with a well-defined purpose.
9. Template – Each component’s view is associated with its companion template. A
template in Angular is a form of HTML tags that lets Angular know that how it is meant
to render the component.
Answer: The single biggest difference between Angular and jQuery is that while the
former is a JS frontend framework, the latter is a JS library. Despite this, there are some
similarities between the two, such as both features DOM manipulation and provides
support for animation.
Question: Could you explain the difference between Angular expressions and
JavaScript expressions?
Answer: Although both Angular expressions and JavaScript expressions can contain
literals, operators, and variables, there are some notable dissimilarities between the two.
Important differences between Angular expressions and JavaScript expressions are
enlisted below:
Answer: Each Angular app gets compiled internally. The Angular compiler takes in the
JS code, compiles it and then produces some JS code. This happens only once per
occasion per user. It is known as AOT (Ahead-Of-Time) compilation.
Answer: In order to connect application data with the DOM (Data Object Model), data
binding is used. It happens between the template (HTML) and component (TypeScript).
There are 3 ways to achieve data binding:
1. Event Binding – Enables the application to respond to user input in the target
environment
2. Property Binding – Enables interpolation of values computed from application data into
the HTML
3. Two-way Binding – Changes made in the application state gets automatically reflected in
the view and vice-versa. The ngModel directive is used for achieving this type of data
binding.
Question: Can you draw a comparison between the service() and the factory()
functions?
Answer: Used for the business layer of the application, the service() function operates as
a constructor function. The function is invoked at runtime using the new keyword.
Although the factory() function works in pretty much the same way as the service()
function does, the former is more flexible and powerful. In actual, the factory() function
are design patterns that help in creating objects.
Answer: The process of monitoring the watchlist in order to track changes in the value of
the watch variable is termed the digest cycle in Angular. The previous and present
versions of the scope model values are compared in each digest cycle.
Although the digest cycle process gets triggered implicitly, it is possible to start it
manually by using the $apply() function.
Answer: In order to format the value of expression so that it can be displayed to the user,
AngularJS has filters. It is possible to add these filters to the controllers, directives,
services, or templates. AngularJS also provides support for creating custom filters.
Organizing data in such a way so that it is displayed only when certain criteria are
fulfilled is made possible using filters. Filters are added to the expressions using the pipe
‘|’ character. Various types of AngularJS filters are enumerated as follows:
Angular Elements – It allows converting Angular components into web components and
embeds the same in some non-Angular application
Tree Shakeable Provider – Angular 6 introduces a new way of registering a provider
directly inside the @Injectable() decorator. It is achieved by using the providedIn
attribute
RxJS 6 – Angular 6 makes use of RxJS 6 internally
i18n (internationalization) – Without having to build the application once per locale, any
Angular application can have “runtime i18n”
Answer: ngOnInit() is a lifecycle hook that is called after Angular has finished
initializing all data-bound properties of a directive. It is defined as:
Interface OnInit {
ngOnInit() : void
}
Answer: In the SPA technology, only a single page, which is index.HTML, is maintained
although the URL keeps on changing. Unlike traditional web technology, SPA
technology is faster and easy to develop as well.
In conventional web technology, as soon as a client requests a webpage, the server sends
the resource. However, when again the client requests for another page, the server
responds again with sending the requested resource. The problem with this technology is
that it requires a lot of time.
function Dummy(target) {
dummy.log('This decorator is Dummy', target);
}
Question: What is the process called by which TypeScript code is converted into
JavaScript code?
Answer: It is called Transpiling. Even though TypeScript is used for writing code in
Angular applications, it gets internally transpiled into equivalent JavaScript.
Question: Discuss the lifecycle designed for directive and components in Angular JS
especially for the newly introduced version 6.0?
Answer:
nhOnInit
ngDoCheck
ngOnDestroy
Constructor
ngOnChanges
ngAfterContentInit (only for components)
ngAfterContentChecked (only for components)
ngAfterViewInit (only for components)
ngAfterViewChecked (only for components)
CLI command updates angular project dependencies to their latest versions. The ng
update is a normal package manager tool to identify and update in normal package
manager tools to identify and update other dependencies.
2. Uses RxJS6
This is the third party library (RxJS) and introduces two important changes as compared
to RxJS5.
3. The <ng-template>
If in an earlier version, the user wanted to provide a service to the entire application, the
user was required to add it to providers in the AppModule but it is not required in the
case of Angular6.
5. Renamed Operators
Answer:
Out of box Features: Several built-in features like routing, state management, rxjs
library, and HTTP services are straight out of the box services provided by Angular. So,
one does not need to look for the above-stated features separately.
Declarative UI: Angular uses HTML to render the UI of an application as it is a
declarative language and is much easier to use than JavaScript.
Long-term Google Support: Google plans to stick with Angular and further scale up its
ecosystem as it has offered its long term support to Angular.
Answer:
Expression A developer needs to remember the correct Property binding is done using "[ ]"
Syntax ng-directive for binding an event or a attribute and event binding is done
property. using "( )" attribute.
Fast Rendering: The browser loads the executable code and renders it immediately as
the application is compiled before running inside the browser.
Fewer Ajax Requests: The compiler sends the external HTML and CSS files along with
the application, eliminating AJAX requests for those source files.
Minimizing Errors: Easy to detect and handle errors during the building phase.
Better Security: Before an application runs inside the browser, the AOT compiler adds
HTML and templates into the JS files, so there are no extra HTML files to be read, thus
providing better security for the application.
Question: What are Lifecycle hooks in Angular? Explain some life cycles hooks.
Answer: Angular components enter its lifecycle from the time it is created to the time it
is destroyed. Angular hooks provide ways to tap into these phases and trigger changes at
specific phases in a lifecycle.
ngOnChanges(): This method is called whenever one or more input properties of the
component changes. The hook receives a SimpleChanges object containing the previous
and current values of the property.
ngOnInit(): This hook gets called once, after the ngOnChanges hook.
It initializes the component and sets the input properties of the component.
ngDoCheck(): It gets called after ngOnChanges and ngOnInit and is used to detect and
act on changes that cannot be detected by Angular.
We can implement our change detection algorithm in this hook.
ngAfterContentInit(): It gets called after the first ngDoCheck hook. This hook responds
after the content gets projected inside the component.
ngAfterContentChecked(): It gets called after ngAfterContentInit and every subsequent
ngDoCheck. It responds after the projected content is checked.
ngAfterViewInit(): It responds after a component's view, or a child component's view is
initialized.
ngAfterViewChecked(): It gets called after ngAfterViewInit, and it responds after the
component's view, or the child component's view is checked.
ngOnDestroy(): It gets called just before Angular destroys the component. This hook can
be used to clean up the code and detach event handlers.
Better User Experience: Allows users to see the view of the application instantly.
Better SEO: Universal ensures that the content is available on every search engine
leading to better SEO.
Loads Faster: Render pages are available to the browsers sooner, so the server-side
application loads faster.
Answer: MVVM architecture removes tight coupling between each component. The
MVVM architecture comprises of three parts:
Model
View
ViewModel
The architecture allows the children to have reference through observables and not
directly to their parents.
Model: It represents the data and the business logic of an application, or we may say it
contains the structure of an entity. It consists of the business logic - local and remote
data source, model classes, repository.
View: View is a visual layer of the application, and so consists of the UI Code(in Angular-
HTML template of a component.). It sends the user action to the ViewModel but does
not get the response back directly. It has to subscribe to the observables which
ViewModel exposes to it to get the response.
ViewModel: It is an abstract layer of the application and acts as a bridge between the
View and Model(business logic). It does not have any clue which View has to use it as it
does not have a direct reference to the View. View and ViewModel are connected with
data-binding so, any change in the View the ViewModel takes note and changes the
data inside the Model. It interacts with the Model and exposes the observable that can
be observed by the View.
Conclusion
You need to be confident while giving the Anterview interview. Also, try avoiding
hogwash in case you’re asked a question that you don’t know about. A simple no is better
than giving some random non-answer and adding unnecessary details. Candidates that are
straightforward and honest are preferred over those pretending to be know-it-alls!
Further, don’t disburse your personal details until asked for. The interviewer is more
interested in knowing you as a technical person. So, all the very best! Do let us know the
Angular questions you faced in the interview that are not covered here so that we can add
those here for the benefit of the Angular community.
Are these questions also relevant as Angular JS Interview Questions? Yes, these
questions are helpful while preparing for the AngularJS interview. Angular is the top
programming language and used by most web developers.
276
1.
⬆ Back to Top
2.
AngularJS Angular
It is based on MVC architecture This is based on Service/Controller
It uses JavaScript to build the Introduced the TypeScript to write the
application application
Based on controllers concept This is a component based UI approach
Not a mobile friendly framework Developed considering mobile platform
Difficulty in SEO friendly application
Ease to create SEO friendly applications
development
⬆ Back to Top
3.
3. What is TypeScript?
document.body.innerHTML = greeter(user);
⬆ Back to Top
4.
⬆ Back to Top
5.
⬆ Back to Top
6.
Now this directive extends HTML element behavior with a yellow background as
below
⬆ Back to Top
7.
Components are the most basic UI building block of an Angular app which
formed a tree of Angular components. These components are subset of directives.
Unlike directives, components always have a template and only one component
can be instantiated per an element in a template. Let's see a simple example of
Angular component
import { Component } from '@angular/core';
@Component ({
selector: 'my-app',
template: ` <div>
<h1>{{title}}</h1>
<div>Learn Angular6 with examples</div>
</div> `,
})
⬆ Back to Top
8.
Component Directive
To register a component we use To register directives we use
@Component meta-data annotation @Directive meta-data annotation
Components are typically used to create UI Directive is used to add behavior to
widgets an existing DOM element
Component is used to break up the Directive is use to design re-usable
application into smaller components components
Only one component can be present per Many directives can be used per
DOM element DOM element
@View decorator or templateurl/template
Directive doesn't use View
are mandatory
⬆ Back to Top
9.
9. What is a template?
A template is a HTML view where you can display data by binding controls to
properties of an Angular component. You can store your component's template in
one of two places. You can define it inline using the template property, or you can
define the template in a separate HTML file and link to it in the component
metadata using the @Component decorator's templateUrl property.
@Component ({
selector: 'my-app',
template: '
<div>
<h1>{{title}}</h1>
<div>Learn Angular</div>
</div>
'
})
@Component ({
selector: 'my-app',
templateUrl: 'app/app.component.html'
})
⬆ Back to Top
10.
10.What is a module?
Modules are logical boundaries in your application and the application is divided
into separate modules to separate the functionality of your application. Lets take
an example of app.module.ts root module declared with @NgModule decorator
as below,
@NgModule ({
imports: [ BrowserModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ],
providers: []
})
export class AppModule { }
⬆ Back to Top
11.
Angular application goes through an entire set of processes or has a lifecycle right
from its initiation to the end of the application. The representation of lifecycle in
pictorial representation as follows,
⬆ Back to Top
12.
⬆ Back to Top
13.
13.What is metadata?
Metadata is used to decorate a class so that it can configure the expected behavior
of the class. The metadata is represented by decorators
22. Property decorators Used for properties inside classes, e.g. @Input and
@Output
23. import { Component, Input } from '@angular/core';
24.
25. @Component({
26. selector: 'my-component',
27. template: '<div>Property decorator</div>'
28. })
29.
30. export class MyComponent {
31. @Input()
32. title: string;
}
33. Method decorators Used for methods inside classes, e.g. @HostListener
34. import { Component, HostListener } from '@angular/core';
35.
36. @Component({
37. selector: 'my-component',
38. template: '<div>Method decorator</div>'
39. })
40. export class MyComponent {
41. @HostListener('click', ['$event'])
42. onHostClick(event: Event) {
43. // clicked, `event` available
44. }
}
45. Parameter decorators Used for parameters inside class constructors, e.g.
@Inject, Optional
46. import { Component, Inject } from '@angular/core';
47. import { MyService } from './my-service';
48.
49. @Component({
50. selector: 'my-component',
51. template: '<div>Parameter decorator</div>'
52. })
53. export class MyComponent {
54. constructor(@Inject(MyService) myService) {
55. console.log(myService); // MyService
56. }
}
⬆ Back to Top
14.
Below are the list of few commands, which will come handy while creating
angular projects
⬆ Back to Top
15.
TypeScript classes has a default method called constructor which is normally used
for the initialization purpose. Whereas ngOnInit method is specific to Angular,
especially used to define Angular bindings. Even though constructor getting
called first, it is preferred to move all of your Angular bindings to ngOnInit
method. In order to use ngOnInit, you need to implement OnInit interface as
below,
ngOnInit(){
//called after the constructor and called after the first
ngOnChanges()
}
}
⬆ Back to Top
16.
16.What is a service?
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.
fetchAll(){
return this.http.get('https://api.github.com/repositories');
}
}
⬆ Back to Top
17.
⬆ Back to Top
18.
19.
The AsyncPipe subscribes to an observable or promise and returns the latest value
it has emitted. When a new value is emitted, the pipe marks the component to be
checked for changes.
Let's take a time observable which continuously updates the view for every 2
seconds with the current time.
@Component({
selector: 'async-observable-pipe',
template: `<div><code>observable|async</code>:
Time: {{ time | async }}</div>`
})
export class AsyncObservablePipeComponent {
time = new Observable(observer =>
setInterval(() => observer.next(new Date().toString()), 2000)
);
}
⬆ Back to Top
20.
You can store your component's template in one of two places. You can define it
inline using the template property, or you can define the template in a separate
HTML file and link to it in the component metadata using the @Component
decorator's templateUrl property.
The choice between inline and separate HTML is a matter of taste, circumstances,
and organization policy. But normally we use inline template for small portion of
code and external template file for bigger views. By default, the Angular CLI
generates components with a template file. But you can override that with the
below command,
21.
We use Angular ngFor directive in the template to display each item in the list.
For example, here we iterate over list of users,
⬆ Back to Top
22.
Note: Angular isn't showing and hiding the message. It is adding and removing
the paragraph element from the DOM. That improves performance, especially in
the larger projects with many data bindings.
⬆ Back to Top
23.
Angular recognizes the value as unsafe and automatically sanitizes it, which
removes the script tag but keeps safe content such as the text content of the
script tag. This way it eliminates the risk of script injection attacks. If you still
use it then it will be ignored and a warning appears in the browser console.
⬆ Back to Top
24.
24.What is interpolation?
Interpolation is a special syntax that Angular converts into property binding. It’s a
convenient alternative to property binding. It is represented by double curly
braces({{}}). The text between the braces is often the name of a component
property. Angular replaces that name with the string value of the corresponding
component property.
<h3>
{{title}}
<img src="{{url}}" style="height:30px">
</h3>
In the example above, Angular evaluates the title and url properties and fills in the
blanks, first displaying a bold application title and then a URL.
⬆ Back to Top
25.
⬆ Back to Top
26.
1. new
2. increment and decrement operators, ++ and --
3. operator assignment, such as += and -=
4. the bitwise operators | and &
5. the template expression operators
⬆ Back to Top
27.
⬆ Back to Top
28.
A pipe takes in data as input and transforms it to a desired output. For example,
let us take a pipe to transform a component's birthday property into a human-
friendly date using date pipe.
@Component({
selector: 'app-birthday',
template: `<p>Birthday is {{ birthday | date }}</p>`
})
export class BirthdayComponent {
birthday = new Date(1987, 6, 18); // June 18, 1987
}
⬆ Back to Top
29.
@Component({
selector: 'app-birthday',
template: `<p>Birthday is {{ birthday |
date:'dd/MM/yyyy'}}</p>` // 18/06/1987
})
export class BirthdayComponent {
birthday = new Date(1987, 6, 18);
}
Note: The parameter value can be any valid template expression, such as a string
literal or a component property.
⬆ Back to Top
30.
You can chain pipes together in potentially useful combinations as per the needs.
Let's take a birthday property which uses date pipe(along with parameter) and
uppercase pipes as below
@Component({
selector: 'app-birthday',
template: `<p>Birthday is {{ birthday | date:'fullDate'
| uppercase}} </p>` // THURSDAY, JUNE 18, 1987
})
export class BirthdayComponent {
birthday = new Date(1987, 6, 18);
}
⬆ Back to Top
31.
@Pipe({name: 'myCustomPipe'})
5. The @Pipe decorator allows you to define the pipe name that you'll use
within template expressions. It must be a valid JavaScript identifier.
⬆ Back to Top
32.
You can create custom reusable pipes for the transformation of existing value. For
example, let us create a custom pipe for finding file size based on an extension,
@Pipe({name: 'customFileSizePipe'})
export class FileSizePipe implements PipeTransform {
transform(size: number, extension: string = 'MB'): string {
return (size / (1024 * 1024)).toFixed(2) + extension;
}
}
Now you can use the above pipe in template expression as below,
template: `
<h2>Find the size of a file</h2>
<p>Size: {{288966 | customFileSizePipe: 'GB'}}</p>
`
⬆ Back to Top
33.
A pure pipe is only called when Angular detects a change in the value or the
parameters passed to a pipe. For example, any changes to a primitive input value
(String, Number, Boolean, Symbol) or a changed object reference (Date, Array,
Function, Object). An impure pipe is called for every change detection cycle no
matter whether the value or parameters changes. i.e, An impure pipe is called
often, as often as every keystroke or mouse-move.
⬆ Back to Top
34.
Every application has at least one Angular module, the root module that you
bootstrap to launch the application is called as bootstrapping module. It is
commonly known as AppModule. The default structure of AppModule generated
by AngularCLI would be as follows,
```javascript
/* JavaScript imports */
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
35.
Observables are declarative which provide support for passing messages between
publishers and subscribers in your application. They are mainly used for event
handling, asynchronous programming, and handling multiple values. In this case,
you define a function for publishing values, but it is not executed until a consumer
subscribes to it. The subscribed consumer then receives notifications until the
function completes, or until they unsubscribe.
⬆ Back to Top
36.
⬆ Back to Top
37.
Below are the steps need to be followed for the usage of HttpClient.
1. Import HttpClient into root module:
2. import { HttpClientModule } from '@angular/common/http';
3. @NgModule({
4. imports: [
5. BrowserModule,
6. // import HttpClientModule after BrowserModule.
7. HttpClientModule,
8. ],
9. ......
10. })
export class AppModule {}
⬆ Back to Top
38.
getUserResponse(): Observable<HttpResponse<User>> {
return this.http.get<User>(
this.userUrl, { observe: 'response' });
}
⬆ Back to Top
39.
If the request fails on the server or failed to reach the server due to network issues
then HttpClient will return an error object instead of a successful reponse. In this
case, you need to handle in the component by passing error object as a second
callback to subscribe() method.
fetchUser() {
this.userService.getProfile()
.subscribe(
(data: User) => this.userProfile = { ...data }, // success
path
error => this.error = error // error path
);
}
It is always a good idea to give the user some meaningful feedback instead of
displaying the raw error object returned from HttpClient.
⬆ Back to Top
40.
40.What is RxJS?
For example, you can import observables and operators for using HttpClient as
below,
⬆ Back to Top
41.
41.What is subscribing?
// Execute with the observer object and Prints out each item
source.subscribe(myObserver);
// => Observer got a next value: 1
// => Observer got a next value: 2
// => Observer got a next value: 3
// => Observer got a next value: 4
// => Observer got a next value: 5
// => Observer got a complete notification
⬆ Back to Top
42.
42.What is an observable?
An Observable is a unique Object similar to a Promise that can help manage
async code. Observables are not part of the JavaScript language so we need to
rely on a popular Observable library called RxJS. The observables are created
using new keyword.
⬆ Back to Top
43.
43.What is an observer?
interface Observer<T> {
closed?: boolean;
next: (value: T) => void;
error: (err: any) => void;
complete: () => void;
}
myObservable.subscribe(myObserver);
Note: If you don't supply a handler for a notification type, the observer ignores
notifications of that type.
⬆ Back to Top
44.
⬆ Back to Top
45.
45.What is multicasting?
⬆ Back to Top
46.
You can handle errors by specifying an error callback on the observer instead of
relying on try/catch which are ineffective in asynchronous environment.
myObservable.subscribe({
next(num) { console.log('Next num: ' + num)},
error(err) { console.log('Received an errror: ' + err)}
});
⬆ Back to Top
47.
The subscribe() method can accept callback function definitions in line, for next,
error, and complete handlers is known as short hand notation or Subscribe method
with positional arguments.
myObservable.subscribe(
x => console.log('Observer got a next value: ' + x),
err => console.error('Observer got an error: ' + err),
() => console.log('Observer got a complete notification')
);
⬆ Back to Top
48.
The RxJS library also provides below utility functions for creating and working
with observables.
⬆ Back to Top
49.
⬆ Back to Top
50.
Normally an observer object can define any combination of next, error and
complete notification type handlers. If you don't supply a handler for a
notification type, the observer just ignores notifications of that type.
⬆ Back to Top
51.
⬆ Back to Top
52.
Since Angular elements are packaged as custom elements the browser support of
angular elements is same as custom elements support.
⬆ Back to Top
53.
Custom elements (or Web Components) are a Web Platform feature which
extends HTML by allowing you to define a tag whose content is created and
controlled by JavaScript code. The browser maintains a CustomElementRegistry
of defined custom elements, which maps an instantiable JavaScript class to an
HTML tag. Currently this feature is supported by Chrome, Firefox, Opera, and
Safari, and available in other browsers through polyfills.
⬆ Back to Top
54.
No, custom elements bootstrap (or start) automatically when they are added to the
DOM, and are automatically destroyed when removed from the DOM. Once a
custom element is added to the DOM for any page, it looks and behaves like any
other HTML element, and does not require any special knowledge of Angular.
⬆ Back to Top
55.
56.
⬆ Back to Top
57.
The Component properties and logic maps directly into HTML attributes and the
browser's event system. Let us describe them in two steps,
⬆ Back to Top
58.
58.How do you define typings for custom elements?
You can use the NgElement and WithProperties types exported from
@angular/elements.
5. After applying types typescript validates input value and their types,
6. const container = document.createElement('my-container') as
NgElement & WithProperties<{message: string}>;
7. container.message = 'Welcome to Angular elements!';
8. container.message = true; // <-- ERROR: TypeScript knows
this should be a string.
9. container.greet = 'News'; // <-- ERROR: TypeScript knows
there is no `greet` property on `container`.
⬆ Back to Top
59.
⬆ Back to Top
60.
61.
You can use CLI command ng generate directive to create the directive class
file. It creates the source
file(src/app/components/directivename.directive.ts), the respective test
file(.spec.ts) and declare the directive class file in root module.
⬆ Back to Top
62.
Let's take simple highlighter behavior as a example directive for DOM element.
You can create and apply the attribute directive using below steps,
12. Run the application to see the highlight behavior on paragraph element
ng serve
⬆ Back to Top
63.
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.
⬆ Back to Top
64.
The routing application should add element to the index.html as the first child in
the tag in order to indicate how to compose navigation URLs. If app folder is the
application root then you can set the href value as below
<base href="/">
⬆ Back to Top
65.
The Angular Router which represents a particular component view for a given
URL is not part of Angular Core. It is available in library named
@angular/router to import required router components. For example, we import
them in app module as below,
⬆ Back to Top
66.
<router-outlet></router-outlet>
<!-- Routed components go here -->
⬆ Back to Top
67.
The RouterLink is a directive on the anchor tags give the router control over those
elements. Since the navigation paths are fixed, you can assign string values to
router-link directive as below,
<h1>Angular Router</h1>
<nav>
<a routerLink="/todosList" >List of todos</a>
<a routerLink="/completed" >Completed todos</a>
</nav>
<router-outlet></router-outlet>
⬆ Back to Top
68.
<h1>Angular Router</h1>
<nav>
<a routerLink="/todosList" routerLinkActive="active">List of
todos</a>
<a routerLink="/completed" routerLinkActive="active">Completed
todos</a>
</nav>
<router-outlet></router-outlet>
⬆ Back to Top
69.
RouterState is a tree of activated routes. Every node in this tree knows about the
"consumed" URL segments, the extracted parameters, and the resolved data. You
can access the current RouterState from anywhere in the application using the
Router service and the routerState property.
@Component({templateUrl:'template.html'})
class MyComponent {
constructor(router: Router) {
const state: RouterState = router.routerState;
const root: ActivatedRoute = state.root;
const child = root.firstChild;
const id: Observable<string> = child.params.map(p => p.id);
//...
}
}
⬆ Back to Top
70.
During each navigation, the Router emits navigation events through the
Router.events property allowing you to track the lifecycle of the route.
1. NavigationStart,
2. RouteConfigLoadStart,
3. RouteConfigLoadEnd,
4. RoutesRecognized,
5. GuardsCheckStart,
6. ChildActivationStart,
7. ActivationStart,
8. GuardsCheckEnd,
9. ResolveStart,
10. ResolveEnd,
11. ActivationEnd
12. ChildActivationEnd
13. NavigationEnd,
14. NavigationCancel,
15. NavigationError
16. Scroll
⬆ Back to Top
71.
@Component({...})
class MyComponent {
constructor(route: ActivatedRoute) {
const id: Observable<string> = route.params.pipe(map(p =>
p.id));
const url: Observable<string> = route.url.pipe(map(segments =>
segments.join('')));
// route.data includes both `data` and `resolve`
const user = route.data.pipe(map(d => d.user));
}
}
⬆ Back to Top
72.
A router must be configured with a list of route definitions. You configures the
router with routes via the RouterModule.forRoot() method, and adds the result
to the AppModule's imports array.
@NgModule({
imports: [
RouterModule.forRoot(
appRoutes,
{ enableTracing: true } // <-- debugging purposes only
)
// other imports here
],
...
})
export class AppModule { }
⬆ Back to Top
73.
If the URL doesn't match any predefined routes then it causes the router to throw
an error and crash the app. In this case, you can use wildcard route. A wildcard
route has a path consisting of two asterisks to match every URL.
⬆ Back to Top
74.
No, the Routing Module is a design choice. You can skip routing Module (for
example, AppRoutingModule) when the configuration is simple and merge the
routing configuration directly into the companion module (for example,
AppModule). But it is recommended when the configuration is complex and
includes specialized guard and resolver services.
⬆ Back to Top
75.
⬆ Back to Top
76.
1. Just-in-Time (JIT)
2. Ahead-of-Time (AOT)
⬆ Back to Top
77.
77.What is JIT?
Just-in-Time (JIT) is a type of compilation that compiles your app in the browser
at runtime. JIT compilation is the default when you run the ng build (build only)
or ng serve (build and serve locally) CLI commands. i.e, the below commands
used for JIT compilation,
ng build
ng serve
⬆ Back to Top
78.
78.What is AOT?
ng build --aot
ng serve --aot
Note: The ng build command with the --prod meta-flag (ng build --prod)
compiles with AOT by default.
⬆ Back to Top
79.
⬆ Back to Top
80.
⬆ Back to Top
81.
⬆ Back to Top
82.
In Angular, You must write metadata with the following general constraints,
⬆ Back to Top
83.
⬆ Back to Top
84.
No, Arrow functions or lambda functions can’t be used to assign values to the
decorator properties. For example, the following snippet is invalid:
@Component({
providers: [{
provide: MyService, useFactory: () => getService()
}]
})
function getService(){
return new MyService();
}
@Component({
providers: [{
provide: MyService, useFactory: getService
}]
})
If you still use arrow function, it generates an error node in place of the function.
When the compiler later interprets this node, it reports an error to turn the arrow
function into an exported function. Note: From Angular5 onwards, the compiler
automatically performs this rewriting while emitting the .js file.
⬆ Back to Top
85.
⬆ Back to Top
86.
No, the AOT collector understands a subset of (or limited) JavaScript features. If
an expression uses unsupported syntax, the collector writes an error node to
the .metadata.json file. Later point of time, the compiler reports an error if it needs
that piece of metadata to generate the application code.
⬆ Back to Top
87.
87.What is folding?
The compiler can only resolve references to exported symbols in the metadata.
Where as some of the non-exported members are folded while generating the
code. i.e Folding is a process in which the collector evaluate an expression during
collection and record the result in the .metadata.json instead of the original
expression. For example, the compiler couldn't refer selector reference because it
is not exported
@Component({
selector: 'app-root'
})
Remember that the compiler can’t fold everything. For example, spread operator
on arrays, objects created using new keywords and function calls.
⬆ Back to Top
88.
The AOT compiler supports macros in the form of functions or static methods
that return an expression in a single return expression. For example, let us
take a below macro function,
@NgModule({
declarations: wrapInArray(TypicalComponent)
})
export class TypicalModule {}
⬆ Back to Top
89.
15. Function calls are not supported: The compiler does not currently
support function expressions or lambda functions. For example, you
cannot set a provider's useFactory to an anonymous function or arrow
function as below.
16. providers: [
17. { provide: MyStrategy, useFactory: function()
{ ... } },
18. { provide: OtherStrategy, useFactory: () =>
{ ... } }
]
⬆ Back to Top
90.
Metadata rewriting is the process in which the compiler converts the expression
initializing the fields such as useClass, useValue, useFactory, and data into an
exported variable, which replaces the expression. Remember that the compiler
does this rewriting during the emit of the .js file but not in definition files( .d.ts
file).
⬆ Back to Top
91.
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
"experimentalDecorators": true,
...
},
"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"preserveWhitespaces": true,
...
}
}
⬆ Back to Top
92.
{
"compilerOptions": {
"experimentalDecorators": true,
...
},
"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"preserveWhitespaces": true,
...
}
}
⬆ Back to Top
93.
93.How do you enable binding expression validation?
You can enable binding expression validation explicitly by adding the compiler
option fullTemplateTypeCheck in the "angularCompilerOptions" of the project's
tsconfig.json. It produces error messages when a type error is detected in a
template binding expression.
@Component({
selector: 'my-component',
template: '{{user.contacts.email}}'
})
class MyComponent {
user?: User;
}
⬆ Back to Top
94.
You can disable binding expression type checking using $any() type cast
function(by surrounding the expression). In the following example, the error
Property contacts does not exist is suppressed by casting user to the any type.
template:
'{{ $any(user).contacts.email }}'
The $any() cast function also works with this to allow access to undeclared
members of the component.
template:
'{{ $any(this).contacts.email }}'
⬆ Back to Top
95.
@Component({
selector: 'my-component',
template: '<span *ngIf="user"> {{user.name}} contacted through
{{contact!.email}} </span>'
})
class MyComponent {
user?: User;
contact?: Contact;
⬆ Back to Top
96.
The expression used in an ngIf directive is used to narrow type unions in the
Angular template compiler similar to if expression in typescript. So *ngIf allows
the typeScript compiler to infer that the data used in the binding expression will
never be undefined.
@Component({
selector: 'my-component',
template: '<span *ngIf="user"> {{user.contact.email}} </span>'
})
class MyComponent {
user?: User;
}
⬆ Back to Top
97.
⬆ Back to Top
98.
98.What is zone?
A Zone is an execution context that persists across async tasks. Angular relies on
zone.js to run Angular's change detection processes when native JavaScript
operations raise events
⬆ Back to Top
99.
⬆ Back to Top
100.
Codelyzer provides set of tslint rules for static code analysis of Angular
TypeScript projects. ou can run the static code analyzer over web apps,
NativeScript, Ionic etc. Angular CLI has support for this and it can be use as
below,
ng new codelyzer
ng lint
⬆ Back to Top
101.
⬆ Back to Top
102.
You need to follow below steps to implement animation in your angular project,
⬆ Back to Top
103.
Angular's state() function is used to define different states to call at the end of
each transition. This function takes two arguments: a unique name like open or
closed and a style() function.
state('open', style({
height: '300px',
opacity: 0.5,
backgroundColor: 'blue'
})),
⬆ Back to Top
104.
The style function is used to define a set of styles to associate with a given state
name. You need to use it along with state() function to set CSS style attributes.
For example, in the close state, the button has a height of 100 pixels, an opacity of
0.8, and a background color of green.
state('close', style({
height: '100px',
opacity: 0.8,
backgroundColor: 'green'
})),
Note: The style attributes must be in camelCase.
⬆ Back to Top
105.
@Component({
selector: 'app-animate',
templateUrl: `<div [@changeState]="currentState" class="myblock
mx-auto"></div>`,
styleUrls: `.myblock {
background-color: green;
width: 300px;
height: 250px;
border-radius: 5px;
margin: 5rem;
}`,
animations: [
trigger('changeState', [
state('state1', style({
backgroundColor: 'green',
transform: 'scale(1)'
})),
state('state2', style({
backgroundColor: 'red',
transform: 'scale(1.5)'
})),
transition('*=>state1', animate('300ms')),
transition('*=>state2', animate('2000ms'))
])
]
})
export class AnimateComponent implements OnInit {
@Input() currentState;
constructor() { }
ngOnInit() {
}
}
⬆ Back to Top
106.
The animation transition function is used to specify the changes that occur
between one state and another over a period of time. It accepts two arguments: the
first argument accepts an expression that defines the direction between two
transition states, and the second argument accepts an animate() function.
Let's take an example state transition from open to closed with an half second
transition between states.
⬆ Back to Top
107.
⬆ Back to Top
108.
⬆ Back to Top
109.
⬆ Back to Top
110.
AngularJS Angular
Dependency injection tokens are Tokens can have different types. They are
always strings often classes and sometimes can be strings.
There is exactly one injector even There is a tree hierarchy of injectors, with a
though it is a multi-module root injector and an additional injector for
applications each component.
⬆ Back to Top
111.
Angular Ivy is a new rendering engine for Angular. You can choose to opt in a
preview version of Ivy from Angular version 8.
1. You can enable ivy in a new project by using the --enable-ivy flag with the
ng new command
⬆ Back to Top
112.
⬆ Back to Top
113.
{
"projects": {
"my-project": {
"architect": {
"build": {
"options": {
...
"aot": true,
}
}
}
}
}
}
⬆ Back to Top
114.
The Angular Language Service is a way to get completions, errors, hints, and
navigation inside your Angular templates whether they are external in an HTML
file or embedded in annotations/decorators in a string. It has the ability to
autodetect that you are opening an Angular file, reads your tsconfig.json file,
finds all the templates you have in your application, and then provides all the
language services.
⬆ Back to Top
115.
You can install Angular Language Service in your project with the following npm
command,
After that add the following to the "compilerOptions" section of your project's
tsconfig.json
"plugins": [
{"name": "@angular/language-service"}
]
Note: The completion and diagnostic services works for .ts files only. You need
to use custom plugins for supporting HTML files.
⬆ Back to Top
116.
Yes, Angular Language Service is currently available for Visual Studio Code and
WebStorm IDEs. You need to install angular language service using an extension
and devDependency respectively. In sublime editor, you need to install typescript
which has has a language service plugin model.
⬆ Back to Top
117.
118.
You can add web worker anywhere in your application. For example, If the file
that contains your expensive computation is src/app/app.component.ts, you
can add a Web Worker using ng generate web-worker app command which
will create src/app/app.worker.ts web worker file. This command will
perform below actions,
Note: You may need to refactor your initial scaffolding web worker code for
sending messages to and from.
⬆ Back to Top
119.
You need to remember two important things when using Web Workers in Angular
projects,
⬆ Back to Top
120.
In Angular8, the CLI Builder API is stable and available to developers who want
to customize the Angular CLI by adding or modifying commands. For example,
you could supply a builder to perform an entirely new task, or to change which
third-party tool is used by an existing command.
⬆ Back to Top
121.
⬆ Back to Top
122.
122. How do you invoke a builder?
The Angular CLI command ng run is used to invoke a builder with a specific
target configuration. The workspace configuration file, angular.json, contains
default configurations for built-in builders.
⬆ Back to Top
123.
An App shell is a way to render a portion of your application via a route at build
time. This is useful to first paint of your application that appears quickly because
the browser can render static HTML and CSS without the need to initialize
JavaScript. You can achieve this using Angular CLI which generates an app shell
for running server-side of your app.
⬆ Back to Top
124.
⬆ Back to Top
125.
1. @Component()
2. @Directive()
3. @Pipe()
4. @Injectable()
5. @NgModule()
⬆ Back to Top
126.
The class field decorators are the statements declared immediately before a field
in a class definition that defines the type of that field. Some of the examples are:
@input and @output,
@Input() myProperty;
@Output() myEvent = new EventEmitter();
⬆ Back to Top
127.
Declarable is a class type that you can add to the declarations list of an
NgModule. The class types such as components, directives, and pipes comes can
be declared in the module. The structure of declarations would be,
declarations: [
YourComponent,
YourPipe,
YourDirective
],
⬆ Back to Top
128.
⬆ Back to Top
129.
⬆ Back to Top
130.
⬆ Back to Top
131.
subject.subscribe({
next: (v) => console.log(`observerA: ${v}`)
});
subject.subscribe({
next: (v) => console.log(`observerB: ${v}`)
});
subject.next(1);
subject.next(2);
⬆ Back to Top
132.
Bazel is a powerful build tool developed and massively used by Google and it can
keep track of the dependencies between different packages and build targets. In
Angular8, you can build your CLI application with Bazel. Note: The Angular
framework itself is built with Bazel.
⬆ Back to Top
133.
⬆ Back to Top
134.
The @angular/bazel package provides a builder that allows Angular CLI to use
Bazel as the build tool.
ng add @angular/bazel
2. Use in a new application: Install the package and create the application
with collection option
3. npm install -g @angular/bazel
ng new --collection=@angular/bazel
When you use ng build and ng serve commands, Bazel is used behind the scenes
and outputs the results in dist/bin folder.
⬆ Back to Top
135.
Sometimes you may want to bypass the Angular CLI builder and run Bazel
directly using Bazel CLI. You can install it globally using @bazel/bazel npm
package. i.e, Bazel CLI is available under @bazel/bazel package. After you can
apply the below common commands,
⬆ Back to Top
136.
⬆ Back to Top
137.
If multiple modules imports the same module then angular evaluates it only once
(When it encounters the module first time). It follows this condition even the
module appears at any level in a hierarchy of imported NgModules.
⬆ Back to Top
138.
<input #uname>
and define view child directive and access it in ngAfterViewInit lifecycle hook
@ViewChild('uname') input;
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
⬆ Back to Top
139.
In Angular7, you can subscribe to router to detect the changes. The subscription
for router events would be as below,
@Component({
selector: 'app-root',
template: `<router-outlet></router-outlet>`
})
export class AppComponent {
⬆ Back to Top
140.
You can directly pass object map for http client or create HttpHeaders class to supply the
headers.
(or)
let headers = new HttpHeaders().set('header1', headerValue1); // create
header object
headers = headers.append('header2', headerValue2); // add a new header,
creating a new object
headers = headers.append('header3', headerValue3); // add another header
⬆ Back to Top
From Angular8 release onwards, the applications are built using differential loading
strategy from CLI to build two separate bundles as part of your deployed application.
1. The first build contains ES2015 syntax which takes the advantage of built-in
support in modern browsers, ships less polyfills, and results in a smaller bundle
size.
2. The second build contains old ES5 syntax to support older browsers with all
necessary polyfills. But this results in a larger bundle size.
Note: This strategy is used to support multiple browsers but it only load the code that the
browser needs.
⬆ Back to Top
Yes, Angular 8 supports dynamic imports in router configuration. i.e, You can use the
import statement for lazy loading the module using loadChildren method and it will be
understood by the IDEs(VSCode and WebStorm), webpack, etc. Previously, you have
been written as below to lazily load the feature module. By mistake, if you have typo in
the module name it still accepts the string and throws an error during build time.
This problem is resolved by using dynamic imports and IDEs are able to find it during
compile time itself.
⬆ Back to Top
Lazy loading is one of the most useful concepts of Angular Routing. It helps us to
download the web pages in chunks instead of downloading everything in a big bundle. It
is used for lazy loading by asynchronously loading the feature module for routing
whenever required using the property loadChildren. Let's load both Customer and
Order feature modules lazily as below,
⬆ Back to Top
Angular 8.0 release introduces Workspace APIs to make it easier for developers to read
and modify the angular.json file instead of manually modifying it. Currently, the only
supported storage3 format is the JSON-based format used by the Angular CLI. You can
enable or add optimization option for build target as below,
buildTarget.options.optimization = true;
addBuildTargetOption();
⬆ Back to Top
The Angular upgrade is quite easier using Angular CLI ng update command as
mentioned below. For example, if you upgrade from Angular 7 to 8 then your lazy loaded
route imports will be migrated to the new import syntax automatically.
⬆ Back to Top
It supports the most recent two versions of all major browsers. The latest version of
Angular material is 8.1.1
⬆ Back to Top
If you are using $location service in your old AngularJS application, now you can use
LocationUpgradeModule(unified location service) which puts the responsibilities of
$location service to Location service in Angular. Let's add this module to AppModule
as below,
@NgModule({
imports: [
// Other NgModule imports...
LocationUpgradeModule.config()
]
})
export class AppModule {}
⬆ Back to Top
What is NgUpgrade?
NgUpgrade is a library put together by the Angular team, which you can use in your
applications to mix and match AngularJS and Angular components and bridge the
AngularJS and Angular dependency injection systems.
⬆ Back to Top
Angular CLI downloads and install everything needed with the Jasmine Test framework.
You just need to run ng test to see the test results. By default this command builds the
app in watch mode, and launches the Karma test runner. The output of test results
would be as below,
Note: A chrome browser also opens and displays the test output in the "Jasmine HTML
Reporter".
⬆ Back to Top
The Angular CLI provides support for polyfills officially. When you create a new project
with the ng new command, a src/polyfills.ts configuration file is created as part of
your project folder. This file includes the mandatory and many of the optional polyfills as
JavaScript import statements. Let's categorize the polyfills,
1. Mandatory polyfills: These are installed automatically when you create your
project with ng new command and the respective import statements enabled in
'src/polyfills.ts' file.
2. Optional polyfills: You need to install its npm package and then create import
statement in 'src/polyfills.ts' file. For example, first you need to install below npm
package for adding web animations (optional) polyfill. bash npm install --
save web-animations-js and create import statement in polyfill file.
javascript import 'web-animations-js';
⬆ Back to Top
⬆ Back to Top
There are different versions of Angular framework. Let's see the features of all the
various versions,
1. Angular 1:
o Angular 1 (AngularJS) is the first angular framework released in the year
2010.
o AngularJS is not built for mobile devices.
o It is based on controllers with MVC architecture.
2. Angular 2:
o Angular 2 was released in the year 2016. Angular 2 is a complete rewrite
of Angular1 version.
o The performance issues that Angular 1 version had has been addressed in
Angular 2 version.
o Angular 2 is built from scratch for mobile devices unlike Angular 1
version.
o Angular 2 is components based.
3. Angular 3:
o The following are the different package versions in Angular 2:
@angular/core v2.3.0
@angular/compiler v2.3.0
@angular/http v2.3.0
@angular/router v3.3.0
o The router package is already versioned 3 so to avoid confusion switched
to Angular 4 version and skipped 3 version.
4. Angular 4:
o The compiler generated code file size in AOT mode is very much reduced.
o With Angular 4 the production bundles size is reduced by hundreds of
KB’s.
o Animation features are removed from angular/core and formed as a
separate package.
o Supports Typescript 2.1 and 2.2.
o Angular Universal
o New HttpClient
5. Angular 5:
o Angular 5 makes angular faster. It improved the loading time and
execution time.
o Shipped with new build optimizer.
o Supports Typescript 2.5.
o Service Worker
6. Angular 6:
o It is released in May 2018.
o Includes Angular Command Line Interface (CLI), Component
Development KIT (CDK), Angular Material Package, Angular Elements.
o Service Worker bug fixes.
o i18n
o Experimental mode for Ivy.
o RxJS 6.0
o Tree Shaking
7. Angular 7:
o It is released in October 2018.
o TypeScript 3.1
o RxJS 6.3
o New Angular CLI
o CLI Prompts capability provide an ability to ask questions to the user
before they run. It is like interactive dialog between the user and the CLI
o With the improved CLI Prompts capability, it helps developers to make
the decision. New ng commands ask users for routing and CSS styles
types(SCSS) and ng add @angular/material asks for themes and gestures
or animations.
8. Angular 8:
o It is released in May 2019.
o TypeScript 3.4
9. Angular 9:
o It is released in February 2020.
o TypeScript 3.7
o Ivy enabled by default
10. Angular 10:
o It is released in June 2020.
o TypeScript 3.9
o TSlib 2.0
⬆ Back to Top
⬆ Back to Top
Angular has supported the integration with the Web Tracing Framework (WTF) for the
purpose of performance testing. Since it is not well maintained and failed in majority of
the applications, the support is deprecated in latest releases.
⬆ Back to Top
⬆ Back to Top
Angular CLI provides it's installed version using below different ways using ng
command,
ng v
ng version
ng -v
ng --version
⬆ Back to Top
Angular supports most recent browsers which includes both desktop and mobile
browsers.
Browser Version
Chrome latest
Browser Version
Firefox latest
Edge 2 most recent major versions
IE 11, 10, 9 (Compatibility mode is not supported)
Safari 2 most recent major versions
IE Mobile 11
iOS 2 most recent major versions
Android 7.0, 6.0, 5.0, 5.1, 4.4
⬆ Back to Top
What is schematic?
It's a scaffolding library that defines how to generate or transform a programming project
by creating, modifying, refactoring, or moving files and code. It defines rules that operate
on a virtual file system called a tree.
⬆ Back to Top
In schematics world, it's a function that operates on a file tree to create, delete, or modify
files in a specific manner.
⬆ Back to Top
Schematics come with their own command-line tool known as Schematics CLI. It is used
to install the schematics executable, which you can use to create a new schematics
collection with an initial named schematic. The collection folder is a workspace for
schematics. You can also use the schematics command to add a new schematic to an
existing collection, or extend an existing schematic. You can install Schematic CLI
globally as below,
npm install -g @angular-devkit/schematics-cli
⬆ Back to Top
⬆ Back to Top
Angular treats all values as untrusted by default. i.e, Angular sanitizes and escapes
untrusted values When a value is inserted into the DOM from a template, via property,
attribute, style, class binding, or interpolation.
⬆ Back to Top
The offline template compiler prevents vulnerabilities caused by template injection, and
greatly improves application performance. So it is recommended to use offline template
compiler in production deployments without dynamically generating any template.
⬆ Back to Top
⬆ Back to Top
Sanitization is the inspection of an untrusted value, turning it into a value that's safe to
insert into the DOM. Yes, Angular suppports sanitization. It sanitizes untrusted values for
HTML, styles, and URLs but sanitizing resource URLs isn't possible because they
contain arbitrary code.
⬆ Back to Top
The innerHtml is a property of HTML-Elements, which allows you to set it's html-
content programmatically. Let's display the below html code snippet in a <div> tag as
below using innerHTML binding,
<div [innerHTML]="htmlSnippet"></div>
Unfortunately this property could cause Cross Site Scripting (XSS) security bugs when
improperly handled.
⬆ Back to Top
What is the difference between interpolated content and innerHTML?
The main difference between interpolated and innerHTML code is the behavior of code
interpreted. Interpolated content is always escaped i.e, HTML isn't interpreted and the
browser displays angle brackets in the element's text content. Where as in innerHTML
binding, the content is interpreted i.e, the browser will convert < and > characters as
HTMLEntities. For example, the usage in template would be as below,
<p>Interpolated value:</p>
<div >{{htmlSnippet}}</div>
<p>Binding of innerHTML:</p>
<div [innerHTML]="htmlSnippet"></div>
Even though innerHTML binding create a chance of XSS attack, Angular recognizes the
value as unsafe and automatically sanitizes it.
⬆ Back to Top
Sometimes the applications genuinely need to include executable code such as displaying
<iframe> from an URL. In this case, you need to prevent automatic sanitization in
Angular by saying that you inspected a value, checked how it was generated, and made
sure it will always be secure. Basically it involves 2 steps,
⬆ Back to Top
No,the built-in browser DOM APIs or methods don't automatically protect you from
security vulnerabilities. In this case it is recommended to use Angular templates instead
of directly interacting with DOM. If it is unavoidable then use the built-in Angular
sanitization functions.
⬆ Back to Top
DomSanitizer is used to help preventing Cross Site Scripting Security bugs (XSS) by
sanitizing values to be safe to use in the different DOM contexts.
⬆ Back to Top
⬆ Back to Top
Angular has built-in support for preventing http level vulnerabilities such as as cross-site
request forgery (CSRF or XSRF) and cross-site script inclusion (XSSI). Even though
these vulnerabilities need to be mitigated on server-side, Angular provides helpers to
make the integration easier on the client side.
⬆ Back to Top
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.
interface HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>>
}
You can use interceptors by declaring a service class that implements the intercept()
method of the HttpInterceptor interface.
@Injectable()
export class MyInterceptor implements HttpInterceptor {
constructor() {}
intercept(req: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> {
...
}
}
@NgModule({
...
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: MyInterceptor,
multi: true
}
]
...
})
export class AppModule {}
⬆ Back to Top
1. Authentication
2. Logging
3. Caching
4. Fake backend
5. URL transformation
6. Modifying headers
⬆ Back to Top
Yes, Angular supports multiple interceptors at a time. You could define multiple
interceptors in providers property:
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: MyFirstInterceptor, multi:
true },
{ provide: HTTP_INTERCEPTORS, useClass: MySecondInterceptor, multi:
true }
],
The interceptors will be called in the order in which they were provided. i.e,
MyFirstInterceptor will be called first in the above interceptors configuration.
⬆ Back to Top
@Injectable()
export class MyInterceptor implements HttpInterceptor {
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
}
}
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, HttpClientModule],
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: MyInterceptor, multi: true }
],
bootstrap: [AppComponent]
})
export class AppModule {}
⬆ Back to Top
⬆ Back to Top
How do you manually register locale data?
By default, Angular only contains locale data for en-US which is English as spoken in the
United States of America . But if you want to set to another locale, you must import
locale data for that new locale. After that you can register using registerLocaleData
method and the syntax of this method looks like below,
For example, let us import German locale and register it in the application
registerLocaleData(localeDe, 'de');
⬆ Back to Top
1. Mark static text messages in your component templates for translation: You
can place i18n on every element tag whose fixed text is to be translated. For
example, you need i18n attribue for heading as below,
2. Create a translation file: Use the Angular CLI xi18n command to extract the
marked text into an industry-standard translation source file. i.e, Open terminal
window at the root of the app project and run the CLI command xi18n.
ng xi18n
The above command creates a file named messages.xlf in your project's root
directory.
Note: You can supply command options to change the format, the name, the
location, and the source locale of the extracted file.
3. Edit the generated translation file: Translate the extracted text into the target
language. In this step, create a localization folder (such as locale)under root
directory(src) and then create target language translation file by copying and
renaming the default messages.xlf file. You need to copy source text node and
provide the translation under target tag. For example, create the translation
file(messages.de.xlf) for German language
4. <trans-unit id="greetingHeader" datatype="html">
5. <source>Hello i18n!</source>
6. <target>Hallo i18n !</target>
7. <note priority="1" from="description">A welcome header for this
sample</note>
8. <note priority="1" from="meaning">welcome message</note>
</trans-unit>
9. Merge the completed translation file into the app: You need to use Angular
CLI build command to compile the app, choosing a locale-specific configuration,
or specifying the following command options.
1. --i18nFile=path to the translation file
2. --i18nFormat=format of the translation file
3. --i18nLocale= locale id
⬆ Back to Top
The Angular i18n attribute marks translatable content. It is a custom attribute, recognized
by Angular tools and compilers. The compiler removes it after translation.
⬆ Back to Top
When you change the translatable text, the Angular extractor tool generates a new id for
that translation unit. Because of this behavior, you must then update the translation file
with the new id every time.
For example, the translation file messages.de.xlf.html has generated trans-unit for
some text message as below
You can avoid this manual update of id attribute by specifying a custom id in the i18n
attribute by using the prefix @@.
<h1 i18n="@@welcomeHeader">Hello i18n!</h1>
⬆ Back to Top
You need to define custom ids as unique. If you use the same id for two different text
messages then only the first one is extracted. But its translation is used in place of both
original text messages.
For example, let's define same custom id myCustomId for two messages,
and the translation unit generated for first text in for German language as
Since custom id is the same, both of the elements in the translation contain the same text
as below
<h2>Guten Morgen</h2>
<h2>Guten Morgen</h2>
⬆ Back to Top
Yes, you can achieve using <ng-container> attribute. Normally you need to wrap a text
content with i18n attribute for the translation. But if you don't want to create a new DOM
element just for the sake of translation, you can wrap the text in an element.
You can translate attributes by attaching i18n-x attribute where x is the name of the
attribute to translate. For example, you can translate image title attribute as below,
By the way, you can also assign meaning, description and id with the i18n-x="|@@"
syntax.
⬆ Back to Top
⬆ Back to Top
ICU expression is is similar to the plural expressions except that you choose among
alternative translations based on a string value instead of a number. Here you define those
string values.
Let's take component binding with residenceStatus property which has "citizen",
"permanent resident" and "foreigner" possible values and the message maps those values
to the appropriate translations.
⬆ Back to Top
1. Error: It throws an error. If you are using AOT compilation, the build will fail.
But if you are using JIT compilation, the app will fail to load.
2. Warning (default): It shows a 'Missing translation' warning in the console or
shell.
3. Ignore: It doesn't do anything.
If you use AOT compiler then you need to perform changes in configurations section
of your Angular CLI configuration file, angular.json.
"configurations": {
...
"de": {
...
"i18nMissingTranslation": "error"
}
}
If you use the JIT compiler, specify the warning level in the compiler config at bootstrap
by adding the 'MissingTranslationStrategy' property as below,
platformBrowserDynamic().bootstrapModule(AppModule, {
missingTranslation: MissingTranslationStrategy.Error,
providers: [
// ...
]
});
⬆ Back to Top
You can provide build configuration such as translation file path, name, format and
application url in configuration settings of Angular.json file. For example, the German
version of your application configured the build as follows,
"configurations": {
"de": {
"aot": true,
"outputPath": "dist/my-project-de/",
"baseHref": "/fr/",
"i18nFile": "src/locale/messages.de.xlf",
"i18nFormat": "xlf",
"i18nLocale": "de",
"i18nMissingTranslation": "error",
}
⬆ Back to Top
An Angular library is an Angular project that differs from an app in that it cannot run on
its own. It must be imported and used in an app. For example, you can import or add
service worker library to an Angular application which turns an application into a
Progressive Web App (PWA).
Note: You can create own third party library and publish it as npm package to be used in
an Application.
⬆ Back to Top
The AOT compiler is part of a build process that produces a small, fast, ready-to-run
application package, typically for production. It converts your Angular HTML and
TypeScript code into efficient JavaScript code during the build phase before the browser
downloads and runs that code.
⬆ Back to Top
You can control any DOM element via ElementRef by injecting it into your component's
constructor. i.e, The component should have constructor with ElementRef parameter,
constructor(myElement: ElementRef) {
el.nativeElement.style.backgroundColor = 'yellow';
}
⬆ Back to Top
What is TestBed?
TestBed is an api for writing unit tests for Angular applications and it's libraries. Even
though We still write our tests in Jasmine and run using Karma, this API provides an
easier way to create components, handle injection, test asynchronous behaviour and
interact with our application.
⬆ Back to Top
What is protractor?
⬆ Back to Top
What is collection?
⬆ Back to Top
You can create your own schematic collections to integrate your library with the Angular
CLI. These collections are classified as 3 main schematics,
⬆ Back to Top
1. Install the dependency: At first, install the jquery dependency using npm
2. Add the jquery script: In Angular-CLI project, add the relative path to jquery in
the angular.json file.
3. "scripts": [
4. "node_modules/jquery/dist/jquery.min.js"
]
5. Start using jquery: Define the element in template. Whereas declare the jquery
variable and apply CSS classes on the element.
6. <div id="elementId">
7. <h1>JQuery integration</h1>
</div>
import {Component, OnInit} from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
ngOnInit(): void {
$(document).ready(() => {
$('#elementId').css({'text-color': 'blue', 'font-size':
'150%'});
});
}
}
⬆ Back to Top
This exception is due to missing HttpClientModule in your module. You just need to
import in module as below,
@NgModule({
imports: [
BrowserModule,
HttpClientModule,
],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
⬆ Back to Top
What is router state?
The RouteState is an interface which represents the state of the router as a tree of
activated routes.
You can access the current RouterState from anywhere in the Angular app using the
Router service and the routerState property.
⬆ Back to Top
When you are creating your project with angular cli, you can use ng newcommand. It
generates all your components with predefined sass files.
But if you are changing your existing style in your project then use ng set command,
⬆ Back to Top
The hidden property is used to show or hide the associated DOM element, based on an
expression. It can be compared close to ng-show directive in AngularJS. Let's say you
want to show user name based on the availability of user using hidden property.
<div [hidden]="!user.name">
My name is: {{user.name}}
</div>
⬆ Back to Top
The main difference is that *ngIf will remove the element from the DOM, while [hidden]
actually plays with the CSS style by setting display:none. Generally it is expensive to
add and remove stuff from the DOM for frequent actions.
⬆ Back to Top
The slice pipe is used to create a new Array or String containing a subset (slice) of the
elements. The syntax looks like as below,
For example, you can provide 'hello' list based on a greeting array,
@Component({
selector: 'list-pipe',
template: `<ul>
<li *ngFor="let i of greeting | slice:0:5">{{i}}</li>
</ul>`
})
export class PipeListComponent {
greeting: string[] = ['h', 'e', 'l', 'l', 'o', 'm','o', 'r', 'n', 'i',
'n', 'g'];
}
⬆ Back to Top
The index property of the NgFor directive is used to return the zero-based index of the
item in each iteration. You can capture the index in a template input variable and use it in
the template.
For example, you can capture the index in a variable named indexVar and displays it with
the todo's name using ngFor directive as below.
<div *ngFor="let todo of todos; let i=index">{{i + 1}} -
{{todo.name}}</div>
⬆ Back to Top
The main purpose of using *ngFor with trackBy option is performance optimization.
Normally if you use NgFor with large data sets, a small change to one item by removing
or adding an item, can trigger a cascade of DOM manipulations. In this case, Angular
sees only a fresh list of new object references and to replace the old DOM elements with
all new DOM elements. You can help Angular to track which items added or removed by
providing a trackBy function which takes the index and the current item as arguments
and needs to return the unique identifier for this item.
⬆ Back to Top
NgSwitch directive is similar to JavaScript switch statement which displays one element
from among several possible elements, based on a switch condition. In this case only the
selected element placed into the DOM. It has been used along with NgSwitch,
NgSwitchCase and NgSwitchDefault directives.
For example, let's display the browser details based on selected browser using ngSwitch
directive.
<div [ngSwitch]="currentBrowser.name">
<chrome-browser *ngSwitchCase="'chrome'"
[item]="currentBrowser"></chrome-browser>
<firefox-browser *ngSwitchCase="'firefox'"
[item]="currentBrowser"></firefox-browser>
<opera-browser *ngSwitchCase="'opera'"
[item]="currentBrowser"></opera-browser>
<safari-browser *ngSwitchCase="'safari'"
[item]="currentBrowser"></safari-browser>
<ie-browser *ngSwitchDefault [item]="currentItem"></ie-
browser>
</div>
⬆ Back to Top
1. Aliasing in metadata: The inputs and outputs in the metadata aliased using a
colon-delimited (:) string with the directive property name on the left and the
public alias on the right. i.e. It will be in the format of propertyName:alias.
2. inputs: ['input1: buyItem'],
outputs: ['outputEvent1: completedEvent']
⬆ Back to Top
The safe navigation operator(?)(or known as Elvis Operator) is used to guard against
null and undefined values in property paths when you are not aware whether a path
exists or not. i.e. It returns value of the object path if it exists, else it returns the null
value.
For example, you can access nested properties of a user profile easily without null
reference errors as below,
⬆ Back to Top
You don't need any special configuration. In Angular9, the Ivy renderer is the default
Angular compiler. Even though Ivy is available Angular8 itself, you had to configure it in
tsconfig.json file as below,
⬆ Back to Top
Angular 9 provides type safe changes in TestBed API changes by replacing the old get
function with the new inject method. Because TestBed.get method is not type-safe. The
usage would be as below,
⬆ Back to Top
In Angular 8, the static flag is required for ViewChild. Whereas in Angular9, you no
longer need to pass this property. Once you updated to Angular9 using ng update, the
migration will remove { static: false } script everywhere.
The Angular template expression language supports three special template expression
operators.
1. Pipe operator
2. Safe navigation operator
3. Non-null assertion operator
⬆ Back to Top
The pipe operator has a higher precedence than the ternary operator (?:). For example, the
expression first ? second : third | fourth is parsed as first ? second :
(third | fourth).
⬆ Back to Top
Basically, there are two main kinds of entry components which are following -
⬆ Back to Top
A bootstrapped component is an entry component that Angular loads into the DOM
during the bootstrap process or application launch time. Generally, this bootstrapped or
root component is named as AppComponent in your root module using bootstrap
property as below.
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpClientModule,
AppRoutingModule
],
providers: [],
bootstrap: [AppComponent] // bootstrapped entry component need to be
declared here
})
⬆ Back to Top
You can use ngDoBootstrap hook for a manual bootstrapping of the application instead
of using bootstrap array in @NgModule annotation. This hook is part of DoBootstap
interface.
interface DoBootstrap {
ngDoBootstrap(appRef: ApplicationRef): void
}
The module needs to be implement the above interface to use the hook for bootstrapping.
⬆ Back to Top
Yes, the bootstrapped component needs to be an entry component. This is because the
bootstrapping process is an imperative process.
⬆ Back to Top
Since router definition requires you to add the component in two places (router and
entryComponents), these components are always entry components.
Note: The compilers are smart enough to recognize a router definition and automatically
add the router component into entryComponents.
⬆ Back to Top
Most of the time, you don't need to explicity to set entry components in entryComponents
array of ngModule decorator. Because angular adds components from both
@NgModule.bootstrap and route definitions to entry components automatically.
⬆ Back to Top
Do I still need to use entryComponents array in Angular9?
⬆ Back to Top
No, only the entry components and template components appears in production builds. If
a component isn't an entry component and isn't found in a template, the tree shaker will
throw it away. Due to this reason, make sure to add only true entry components to reduce
the bundle size.
⬆ Back to Top
The Angular compiler is used to convert the application code into JavaScript code. It
reads the template markup, combines it with the corresponding component class code,
and emits component factories which creates JavaScript representation of the component
along with elements of @Component metadata.
⬆ Back to Top
The @NgModule metadata is used to tell the Angular compiler what components to be
compiled for this module and how to link this module with other modules.
⬆ Back to Top
How does angular finds components, directives and pipes?
The Angular compiler finds a component or directive in a template when it can match the
selector of that component or directive in that template. Whereas it finds a pipe if the
pipe's name appears within the pipe syntax of the template HTML.
⬆ Back to Top
The Angular core libraries and third-party libraries are available as NgModules.
⬆ Back to Top
Feature modules are NgModules, which are used for the purpose of organizing code. The
feature module can be created with Angular CLI using the below command in the root
directory,
Angular CLI creates a folder called my-custom-feature with a file inside called my-
custom-feature.module.ts with the following contents
@NgModule({
imports: [
CommonModule
],
declarations: []
})
export class MyCustomFeature { }
Note: The "Module" suffix shouldn't present in the name because the CLI appends it.
⬆ Back to Top
In the CLI generated feature module, there are two JavaScript import statements at the
top of the file
⬆ Back to Top
Below are the main differences between Angular NgModule and javascript module,
⬆ Back to Top
1. If you use a component without declaring it, Angular returns an error message.
2. If you try to declare the same class in more than one module then compiler emits
an error.
⬆ Back to Top
1. Create the element(component, directive and pipes) and export it from the file
where you wrote it
2. Import it into the appropriate module.
3. Declare it in the @NgModule declarations array.
⬆ Back to Top
If you do import BrowserModule into a lazy loaded feature module, Angular returns an
error telling you to use CommonModule instead. Because BrowserModule’s providers are
for the entire app so it should only be in the root module, not in feature module. Whereas
Feature modules only need the common directives in CommonModule.
⬆ Back to Top
⬆ Back to Top
What is a provider?
@Injectable({
providedIn: 'root', //Angular provide the service in root injector
})
export class MyService {
}
⬆ Back to Top
You should always provide your service in the root injector unless there is a case where
you want the service to be available only if you import a particular @NgModule.
⬆ Back to Top
⬆ Back to Top
1. Set the providedIn property of the @Injectable() to "root". This is the preferred
way(starting from Angular 6.0) of creating a singleton service since it makes your
services tree-shakable.
2. import { Injectable } from '@angular/core';
3.
4. @Injectable({
5. providedIn: 'root',
6. })
7. export class MyService {
}
8. Include the service in root module or in a module that is only imported by root
module. It has been used to register services before Angular 6.0.
9. @NgModule({
10. ...
11. providers: [MyService],
12. ...
})
⬆ Back to Top
If a module defines provides and declarations then loading the module in multiple feature
modules will duplicate the registration of the service. Below are the different ways to
prevent this duplicate behavior.
1. Use the providedIn syntax instead of registering the service in the module.
2. Separate your services into their own module.
3. Define forRoot() and forChild() methods in the module.
⬆ Back to Top
If the RouterModule module didn’t have forRoot() static method then each feature
module would instantiate a new Router instance, which leads to broken application due to
duplicate instances. After using forRoot() method, the root application module imports
RouterModule.forRoot(...) and gets a Router, and all feature modules import
RouterModule.forChild(...) which does not instantiate another Router.
⬆ Back to Top
The Shared Module is the module in which you put commonly used directives, pipes, and
components into one module that is shared(import it) throughout the application.
For example, the below shared module imports CommonModule, FormsModule for
common directives and components, pipes and directives based on the need,
@NgModule({
imports: [ CommonModule ],
declarations: [ UserComponent, NewUserDirective, OrdersPipe ],
exports: [ UserComponent, NewUserDirective, OrdersPipe,
CommonModule, FormsModule ]
})
export class SharedModule { }
⬆ Back to Top
No, it is not recommended to share services by importing module. i.e Import modules
when you want to use directives, pipes, and components only. The best approach to get a
hold of shared services is through 'Angular dependency injection' because importing a
module will result in a new service instance.
⬆ Back to Top
In Angular 9.1, the API method getLocaleDirection can be used to get the current
direction in your app. This method is useful to support Right to Left locales for your
Internationalization based applications.
...
constructor(@Inject(LOCALE_ID) locale) {
What is ngcc?
"scripts": {
"postinstall": "ngcc"
}
⬆ Back to Top
⬆ Back to Top
What is NgZone?
Angular provides a service called NgZone which creates a zone named angular to
automatically trigger change detection when the following conditions are satisfied.
What is NoopZone?
⬆ Back to Top
⬆ Back to Top
What are the possible data update scenarios for change detection?
The change detection works in the following scenarios where the data changes needs to
update the application HTML.
15. HTTP Data Request: You can get data from a server through an HTTP request
16. data = 'default value';
17. constructor(private httpClient: HttpClient) {}
18.
19. ngOnInit() {
20. this.httpClient.get(this.serverUrl).subscribe(response => {
21. this.data = response.data; // change detection will happen
automatically
22. });
}
23. Macro tasks setTimeout() or setInterval(): You can update the data in the
callback function of setTimeout or setInterval
24. data = 'default value';
25.
26. ngOnInit() {
27. setTimeout(() => {
28. this.data = 'data updated'; // Change detection will
happen automatically
29. });
}
30. Micro tasks Promises: You can update the data in the callback function of
promise
31. data = 'initial value';
32.
33. ngOnInit() {
34. Promise.resolve(1).then(v => {
35. this.data = v; // Change detection will happen
automatically
36. });
}
37. Async operations like Web sockets and Canvas: The data can be updated
asynchronously using WebSocket.onmessage() and Canvas.toBlob().
⬆ Back to Top
Execution Context is an abstract concept that holds information about the environment
within the current code being executed. A zone provides an execution context that
persists across asynchronous operations is called as zone context. For example, the zone
context will be same in both outside and inside setTimeout callback function,
zone.run(() => {
// outside zone
expect(zoneThis).toBe(zone);
setTimeout(function() {
// the same outside zone exist here
expect(zoneThis).toBe(zone);
});
});
⬆ Back to Top
There are four lifecycle hooks for asynchronous operations from zone.js.
9. onHasTask: This hook triggers when the status of one kind of task inside a zone
changes from stable(no tasks in the zone) to unstable(a new task is scheduled in
the zone) or from unstable to stable.
10. onHasTask: function(delegate, curr, target, hasTaskState) {
11. console.log('task state changed in the zone:',
hasTaskState);
12. return delegate.hasTask(target, hasTaskState);
}
13. onInvoke: This hook triggers when a synchronous function is going to execute in
the zone.
14. onInvoke: function(delegate, curr, target, callback, applyThis,
applyArgs) {
15. console.log('the callback will be invoked:', callback);
16. return delegate.invoke(target, callback, applyThis,
applyArgs);
}
⬆ Back to Top
NgZone service provides a run() method that allows you to execute a function inside the
angular zone. This function is used to execute third party APIs which are not handled by
Zone and trigger change detection automatically at the correct time.
⬆ Back to Top
You can change the settings of zone by configuring them in a separate file and import it
just after zonejs import. For example, you can disable the requestAnimationFrame()
monkey patch to prevent change detection for no data update as one setting and prevent
DOM events(a mousemove or scroll event) to trigger change detection. Let's say the new
file named zone-flags.js,
/
************************************************************************
***************************
* Zone JS is required by default for Angular.
*/
import `./zone-flags`;
import 'zone.js/dist/zone'; // Included with Angular CLI.
⬆ Back to Top
How do you trigger an animation?
Angular provides a trigger() function for animation in order to collect the states and
transitions with a specific animation name, so that you can attach it to the triggering
element in the HTML template. This function watch for changes and trigger initiates the
actions when a change occurs. For example, let's create trigger named upDown, and attach
it to the button element.
content_copy
@Component({
selector: 'app-up-down',
animations: [
trigger('upDown', [
state('up', style({
height: '200px',
opacity: 1,
backgroundColor: 'yellow'
})),
state('down', style({
height: '100px',
opacity: 0.5,
backgroundColor: 'green'
})),
transition('up => down', [
animate('1s')
]),
transition('down => up', [
animate('0.5s')
]),
]),
],
templateUrl: 'up-down.component.html',
styleUrls: ['up-down.component.css']
})
export class UpDownComponent {
isUp = true;
toggle() {
this.isUp = !this.isUp;
}
⬆ Back to Top
You can configure injectors with providers at different levels of your application by
setting a metadata value. The configuration can happen in one of three places,
1. In the @Injectable() decorator for the service itself
2. In the @NgModule() decorator for an NgModule
3. In the @Component() decorator for a component
⬆ Back to Top
No. The @Injectable() decorator is not strictly required if the class has other Angular
decorators on it or does not have any dependencies. But the important thing here is any
class that is going to be injected with Angular is decorated. i.e, If we add the decorator,
the metadata design:paramtypes is added, and the dependency injection can do it's job.
That is the exact reason to add the @Injectable() decorator on a service if this service has
some dependencies itself. For example, Let's see the different variations of AppService in
a root component,
6. The below AppService with dummy decorator and httpService can be injected in
AppComponent without any problems. This is because meta information is
generated with dummy decorator.
7. function SomeDummyDecorator() {
8. return (constructor: Function) => console.log(constructor);
9. }
10.
11. @SomeDummyDecorator()
12. export class AppService {
13. constructor(http: HttpService) {
14. console.log(http);
15. }
}
and the generated javascript code of above service has meta information about
HttpService, js var AppService = (function () { function AppService(http)
{ console.log(http); } AppService = __decorate([ core_1.Injectable(),
__metadata('design:paramtypes', [http_service_1.HttpService]) ],
AppService); return AppService; }()); exports.AppService = AppService;
3. The below AppService with @injectable decorator and httpService can be injected in
AppComponent without any problems. This is because meta information is generated
with Injectable decorator. js @Injectable({ providedIn: 'root', }) export
class AppService { constructor(http: HttpService) { console.log(http); }
} ⬆ Back to Top
⬆ Back to Top
⬆ Back to Top
Finally, the component with reactive form control appears as below, ```js import
{ Component } from '@angular/core'; import { FormControl } from '@angular/forms';
@Component({
selector: 'user-profile',
styleUrls: ['./user-profile.component.css']
template: `
<label>
User name:
<input type="text" [formControl]="userName">
</label>
`
})
export class UserProfileComponent {
userName = new FormControl('');
}
```
⬆ Back to Top
Dynamic forms is a pattern in which we build a form dynamically based on metadata that
describes a business object model. You can create them based on reactive form API. ⬆
Back to Top
Template driven forms are model-driven forms where you write the logic, validations,
controls etc, in the template part of the code using directives. They are suitable for simple
scenarios and uses two-way binding with [(ngModel)] syntax. For example, you can
create register form easily by following the below simple steps,
17. Bind the form from template to the component using ngModel syntax
18. <input type="text" class="form-control" id="name"
19. required
[(ngModel)]="model.name" name="name">
20. Attach NgForm directive to the tag in order to create FormControl instances and
register them
<form #registerForm="ngForm">
21. Apply the validation message for form controls
22. <label for="name">Name</label>
23. <input type="text" class="form-control" id="name"
24. required
25. [(ngModel)]="model.name" name="name"
26. #name="ngModel">
27. <div [hidden]="name.valid || name.pristine"
28. class="alert alert-danger">
29. Please enter your name
</div>
30. Let's submit the form with ngSubmit directive and add type="submit" button at
the bottom of the form to trigger form submit.
31. <form (ngSubmit)="onSubmit()" #heroForm="ngForm">
32. // Form goes here
<button type="submit" class="btn btn-success" [disabled]="!
registerForm.form.valid">Submit</button>
```html
<div class="container">
<h1>Registration Form</h1>
<form (ngSubmit)="onSubmit()" #registerForm="ngForm">
<div class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" id="name"
required
[(ngModel)]="model.name" name="name"
#name="ngModel">
<div [hidden]="name.valid || name.pristine"
class="alert alert-danger">
Please enter your name
</div>
</div>
<button type="submit" class="btn btn-success" [disabled]="!
registerForm.form.valid">Submit</button>
</form>
</div>
```
⬆ Back to Top
What are the differences between reactive forms and template driven
forms?
Below are the main differences between reactive forms and template driven forms
Feature Reactive Template-Driven
Form model Created(FormControl instance) in
Created by directives
setup component explicitly
Data updates Synchronous Asynchronous
Form custom
Defined as Functions Defined as Directives
validation
No interaction with change detection Need knowledge of the change
Testing
cycle detection process
Immutable(by always returning new Mutable(Property always
Mutability
value for FormControl instance) modified to new value)
Less scalable using due to
Scalability More scalable using low-level APIs
abstraction on APIs
⬆ Back to Top
1. FormGroup: It defines a form with a fixed set of controls those can be managed
together in an one object. It has same properties and methods similar to a
FormControl instance. This FormGroup can be nested to create complex forms as
below.
2. import { Component } from '@angular/core';
3. import { FormGroup, FormControl } from '@angular/forms';
4.
5. @Component({
6. selector: 'user-profile',
7. templateUrl: './user-profile.component.html',
8. styleUrls: ['./user-profile.component.css']
9. })
10. export class UserProfileComponent {
11. userProfile = new FormGroup({
12. firstName: new FormControl(''),
13. lastName: new FormControl(''),
14. address: new FormGroup({
15. street: new FormControl(''),
16. city: new FormControl(''),
17. state: new FormControl(''),
18. zip: new FormControl('')
19. })
20. });
21.
22. onSubmit() {
23. // Store this.userProfile.value in DB
24. }
}
<form [formGroup]="userProfile" (ngSubmit)="onSubmit()">
<label>
First Name:
<input type="text" formControlName="firstName">
</label>
<label>
Last Name:
<input type="text" formControlName="lastName">
</label>
<div formGroupName="address">
<h3>Address</h3>
<label>
Street:
<input type="text" formControlName="street">
</label>
<label>
City:
<input type="text" formControlName="city">
</label>
<label>
State:
<input type="text" formControlName="state">
</label>
<label>
Zip Code:
<input type="text" formControlName="zip">
</label>
</div>
<button type="submit" [disabled]="!
userProfile.valid">Submit</button>
</form>
25. FormArray: It defines a dynamic form in an array format, where you can add
and remove controls at run time. This is useful for dynamic forms when you don’t
know how many controls will be present within the group.
26. import { Component } from '@angular/core';
27. import { FormArray, FormControl } from '@angular/forms';
28.
29. @Component({
30. selector: 'order-form',
31. templateUrl: './order-form.component.html',
32. styleUrls: ['./order-form.component.css']
33. })
34. export class OrderFormComponent {
35. constructor () {
36. this.orderForm = new FormGroup({
37. firstName: new FormControl('John',
Validators.minLength(3)),
38. lastName: new FormControl('Rodson'),
39. items: new FormArray([
40. new FormControl(null)
41. ])
42. });
43. }
44.
45. onSubmitForm () {
46. // Save the items this.orderForm.value in DB
47. }
48.
49. onAddItem () {
50. this.orderForm.controls
51. .items.push(new FormControl(null));
52. }
53.
54. onRemoveItem (index) {
55. this.orderForm.controls['items'].removeAt(index);
56. }
}
<form [formControlName]="orderForm" (ngSubmit)="onSubmit()">
<label>
First Name:
<input type="text" formControlName="firstName">
</label>
<label>
Last Name:
<input type="text" formControlName="lastName">
</label>
<div>
<p>Add items</p>
<ul formArrayName="items">
<li *ngFor="let item of orderForm.controls.items.controls; let
i = index">
<input type="text" formControlName="{{i}}">
<button type="button" title="Remove Item"
(click)="onRemoveItem(i)">Remove</button>
</li>
</ul>
<button type="button" (click)="onAddItem">
Add an item
</button>
</div>
⬆ Back to Top
updateProfile() {
this.userProfile.patchValue({
firstName: 'John',
address: {
street: '98 Crescent Street'
}
});
}
<button (click)="updateProfile()">Update Profile</button>
Note: Remember to update the properties against the exact model structure.
⬆ Back to Top
For example, the user profile component creation becomes easier as shown here.
⬆ Back to Top
You can add a getter property(let's say, diagnostic) inside component to return a JSON
representation of the model during the development. This is useful to verify whether the
values are really flowing from the input box to the model and vice versa or not.
{{diagnostic}}
<div class="form-group">
// FormControls goes here
</div>
⬆ Back to Top
The ngModel directive updates the form control with special Angular CSS classes to
reflect it's state. Let's find the list of classes in a tabular format,
⬆ Back to Top
In a model-driven form, you can reset the form just by calling the function reset() on
our form model. For example, you can reset the form model on submission as follows,
onSubmit() {
if (this.myform.valid) {
console.log("Form is submitted");
// Perform business logic here
this.myform.reset();
}
}
Now, your form model resets the form back to its original pristine state.
⬆ Back to Top
1. Sync validators: These are the synchronous functions which take a control
instance and immediately return either a set of validation errors or null. Also,
these functions passed as second argument while instantiating the form control.
The main use cases are simple checks like whether a field is empty, whether it
exceeds a maximum length etc.
2. Async validators: These are the asynchronous functions which take a control
instance and return a Promise or Observable that later emits a set of validation
errors or null. Also, these functions passed as second argument while instantiating
the form control. The main use cases are complex validations like hitting a server
to check the availability of a username or email.
this.myForm = formBuilder.group({
firstName: ['value'],
lastName: ['value', *Some Sync validation function*],
email: ['value', *Some validation function*, *Some asynchronous
validation function*]
});
⬆ Back to Top
⬆ Back to Top
Since all validators run after every form value change, it creates a major impact on
performance with async validators by hitting the external API on each keystroke. This
situation can be avoided by delaying the form validity by changing the updateOn
property from change (default) to submit or blur. The usage would be different based on
form types,
⬆ Back to Top
Sometimes you may need to both ngFor and ngIf on the same element but unfortunately
you are going to encounter below template error.
<ng-container *ngIf="items">
<ul *ngFor="let item of items">
<li></li>
</ul>
</ng-container>
⬆ Back to Top
The :host pseudo-class selector is used to target styles in the element that hosts the
component. Since the host element is in a parent component's template, you can't reach
the host element from inside the component by other means. For example, you can create
a border for parent element as below,
⬆ Back to Top
In Angular, there is an url property of router package to get the current route. You need
to follow the below few steps,
console.log(this.router.url); // /routename
During compile time, Angular CLI will download and inline the fonts that your
application is using. This performance update speed up the first contentful paint(FCP)
and this feature is enabled by default in apps built with version 11.