The Angular is the newest form of the AngularJS, developed and maintained by the Angular Team at Google and the father of Angular is 'Misko Hevery', which is an open-source front-end development platform used for building mobile and desktop web application.
Interviews questions (23 to 44)
24 What happens if you use script tag inside
template?
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. Let's take an example of innerHtml
property binding which causes XSS vulnerability,
export class InnerHtmlBindingComponent {
// For example, a user/attacker-controlled value from a URL.
htmlSnippet = 'Template
<script>alert("0wned")</script>
<b>Syntax</b>';
}
25. 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 replace that name
with the string value of the corresponding component property. Let's take an
example,
<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.
26. What are template expressions?
A template expression produces a value similar
to any Javascript expression. Angular executes the expression and assigns it to
a property of a binding target; the target might be an HTML element, a
component, or a directive. In the property binding, a template expression
appears in quotes to the right of the = symbol as in
[property]="expression". In interpolation syntax, the template
expression is surrounded by double curly braces. For example, in the below
interpolation, the template expression is {{username}},
<h3>{{username}}, welcome to Angular</h3>
The below javascript expressions are
prohibited in template expression
iii.
assignments (=, +=,
-=, ...)
iv.
new
v.
chaining expressions
with ; or ,
vi.
increment and
decrement operators (++ and --)
27 What
are template statements?
A template statement responds to an event
raised by a binding target such as an element, component, or directive. The
template statements appear in quotes to the right of the = symbol like (event)="statement". Let's take an example of button click
event's statement
<button (click)="editProfile()">Edit Profile</button>
In the above expression, editProfile is a
template statement. The below JavaScript syntax expressions are not allowed.
.
new
i.
increment and
decrement operators, ++ and --
ii.
operator assignment,
such as += and -=
iii.
the bitwise operators
| and &
iv.
the template
expression operators
28. How
do you categorize data binding types?
Binding types can be grouped into three
categories distinguished by the direction of data flow. They are listed as
below,
.
From the
source-to-view
i.
From view-to-source
ii.
View-to-source-to-view
The possible binding syntax can be tabularized
as below,
Data direction
|
Syntax
|
Type
|
From
the source-to-view(One-way)
|
1.
{{expression}} 2. [target]="expression" 3.
bind-target="expression"
|
Interpolation,
Property, Attribute, Class, Style
|
From
view-to-source(One-way)
|
1.
(target)="statement" 2. on-target="statement"
|
Event
|
View-to-source-to-view(Two-way)
|
1.
[(target)]="expression" 2. bindon-target="expression"
|
Two-way
|
29. What
are pipes?
A pipe takes in data as input and transforms it
to the desired output. For example, let us take a pipe to transform a component's
birthday property into a human-friendly date using date pipe.
import { Component } from '@angular/core';
@Component({
selector: 'app-birthday',
template: `<p>Birthday is {{ birthday | date }}</p>`
})
export class BirthdayComponent {
birthday = new Date(1987, 6, 18); // June 18, 1987
}
30. What
is a parameterized pipe?
A pipe can accept any number of optional
parameters to fine-tune its output. The parameterized pipe can be created by
declaring the pipe name with a colon ( : ) and then the parameter value. If the
pipe accepts multiple parameters, separate the values with colons. Let's take a
birthday example with a particular format(dd/mm/yyyy):
import { Component } from '@angular/core';
@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.
31. How
do you chain pipes?
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
import { Component } from '@angular/core';
@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);
}
32. What
is a custom pipe?
Apart from built-inn pipes, you can write your
own custom pipe with the below key characteristics,
.
A pipe is a class decorated
with pipe metadata @Pipe decorator, which
you import from the core Angular library For example,
@Pipe({name: 'myCustomPipe'})
ii.
The pipe class
implements the PipeTransform interface's transform method that accepts an input value
followed by optional parameters and returns the transformed value. The
structure of pipeTransform would be as below,
interface PipeTransform {
transform(value: any, ...args: any[]): any
}
iii.
The @Pipe decorator
allows you to define the pipe name that you'll use within template expressions.
It must be a valid JavaScript identifier.
template: `{{someInputValue
| myCustomPipe: someOtherValue}}`
33. Give an example of a custom pipe?
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,
import { Pipe, PipeTransform } from '@angular/core';
@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>
`
34. What is the difference between pure and impure
pipe?
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
parameter changes. i.e, An impure pipe is called often, as often as every
keystroke or mouse-move.
35. What is a bootstrapping module?
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 imports */
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';
/* the AppModule class with the @NgModule decorator */
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
36. What are observables?
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.
37. What are HttpClient and its benefits?
Most of the Front-end applications communicate
with backend services over HTTP protocol using either XMLHttpRequest interface
or the fetch() API. Angular provides a simplified client HTTP API known
as HttpClient which
is based on top of XMLHttpRequest interface. This client is available
from @angular/common/http package. You can import in your root module as below,
import { HttpClientModule } from '@angular/common/http';
The major advantages of HttpClient can be
listed as below,
iii.
Contains testability
features
iv.
Provides typed request
and response objects
v.
Intercept request and
response
vi.
Supports Observalbe
APIs
vii.
Supports streamlined
error handling
38. Explain
on how to use HttpClient with an example?
Below are the steps need to be followed for
the usage of HttpClient.
.
Import HttpClient into
root module:
import { HttpClientModule } from '@angular/common/http';
@NgModule({
imports: [
BrowserModule,
// import HttpClientModule after BrowserModule.
HttpClientModule,
],
......
})
export class AppModule {}
ii.
Inject the HttpClient
into the application: Let's create a userProfileService(userprofile.service.ts)
as an example. It also defines get method of HttpClient
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
const userProfileUrl: string = 'assets/data/profile.json';
@Injectable()
export class UserProfileService {
constructor(private http: HttpClient) { }
getUserProfile() {
return this.http.get(this.userProfileUrl);
}
}
iii.
Create a component for
subscribing service: Let's create a component called
UserProfileComponent(userprofile.component.ts) which inject UserProfileService
and invokes the service method,
fetchUserProfile() {
this.userProfileService.getUserProfile()
.subscribe((data: User) => this.user = {
id: data['userId'],
name: data['firstName'],
city: data['city']
});
}
Since the above service method returns an
Observable which needs to be subscribed in the component.
39 . How can you read full response?
The response body does not return fully
response data because sometimes servers also return special headers or status
code which are important for the application workflow. In order to get a full response, you should use observe option from HttpClient,
getUserResponse(): Observable<HttpResponse<User>> {
return this.http.get<User>(
this.userUrl, { observe: 'response' });
}
Now HttpClient.get() method returns an
Observable of typed HttpResponse rather than just the JSON data.
40. How do you perform Error handling?
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 response. In this case, you need to handle in the
component by passing an error object as a second callback to subscribe() method.
Let's see how it can be handled in the component with an example,
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.
41. What is RxJS?
RxJS is a library for composing asynchronous
and callback-based code in a functional, reactive style using Observables. Many
APIs such as HttpClient produce and consume RxJS Observables and also uses
operators for processing observables. For example, you can import observables
and operators for using HttpClient as below,
import { Observable, throwError } from 'rxjs';
import { catchError, retry } from 'rxjs/operators';
42. What is subscribing?
An Observable instance begins publishing
values only when someone subscribes to it. So you need to subscribe by calling
the subscribe() method
of the instance, passing an observer object to receive the notifications. Let's
take an example of creating and subscribing to a simple observable, with an
observer that logs the received message to the console.
Creates an observable sequence of 5 integers, starting from 1
const source = range(1, 5);
// Create observer object
const myObserver = {
next: x => console.log('Observer got a next value: ' + x),
error: err => console.error('Observer got an
error: ' + err),
complete: () => console.log('Observer got a
complete notification'),
};
// Execute with the observer object and Prints out each
item
myObservable.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
43. 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. Let see the simple example
of observable,
import { Observable } from 'rxjs';
const observable = new Observable(observer => {
setTimeout(() => {
observer.next('Hello from a Observable!');
}, 2000);
});
44. What is an observer?
Observer is an interface for a consumer of
push-based notifications delivered by an Observable. It has below structure,
interface Observer<T> {
closed?: boolean;
next: (value: T) => void;
error: (err: any) => void;
complete: () => void;
}
A handler that implements the Observer
interface for receiving observable notifications will be passed as a parameter
for observable as below,
myObservable.subscribe(myObserver);
Note: If you don't supply a handler for a
notification type, the observer ignores notifications of that type.
0 Comments