FrontendDeveloper.in

Angular Interview Questions

Filter by topic:
  • Apart from built-in pipes, you can write your own custom pipe with the below key characteristics:

    1. A pipe is a class decorated with pipe metadata @Pipe decorator, which you import from the core Angular library For example,
    @Pipe({name: 'myCustomPipe'})
    
    1. 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
    }
    
    1. 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}}`
    
  • 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>
     `
    
  • 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.

  • 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:

    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 { }
    
  • 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.

  • 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,

    1. Contains testability features
    2. Provides typed request and response objects
    3. Intercept request and response
    4. Supports Observable APIs
    5. Supports streamlined error handling
  • Below are the steps need to be followed for the usage of HttpClient.

    1. Import HttpClient into root module:
    import { HttpClientModule } from '@angular/common/http';
    @NgModule({
    imports: [
    BrowserModule,
    // import HttpClientModule after BrowserModule.
    HttpClientModule,
    ],
    ......
    })
     export class AppModule {}
    
    1. 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);
    }
    }
    
    1. Create a component for subscribing service: Let's create a component called UserProfileComponent(userprofile.component.ts), which injects 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.

  • The response body doesn't or may not return full response data because sometimes servers also return special headers or status code, which are important for the application workflow. In order to get the 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.

  • If the request fails on the server or fails 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 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.

  • 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';
    
  • 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
    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
    
  • 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);
    });
    
  • 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.

  • Below are the list of differences between promise and observable:

    ObservablePromise
    Declarative: Computation does not start until subscription, so they can run whenever you need the resultExecutes immediately on creation
    Provides multiple values over timeProvides only one
    Subscribe method is used for error handling that facilitates centralized and predictable error handlingPush errors to the child promises
    Provides chaining and subscription to handle complex applicationsUses only .then() clause
  • Multi-casting is the practice of broadcasting to a list of multiple subscribers in a single execution.

    Let's demonstrate the multi-casting feature:

    var source = Rx.Observable.from([1, 2, 3]);
    var subject = new Rx.Subject();
    var multicasted = source.multicast(subject);
    
    // These are, under the hood, `subject.subscribe({...})`:
    multicasted.subscribe({
    next: (v) => console.log('observerA: ' + v)
    });
    multicasted.subscribe({
    next: (v) => console.log('observerB: ' + v)
    });
    
    // This is, under the hood, `s