All Projects → w11k → Ngx Componentdestroyed

w11k / Ngx Componentdestroyed

Licence: apache-2.0
Unsubscribe from Observables in Angular Components

Programming Languages

typescript
32286 projects

Projects that are alternatives of or similar to Ngx Componentdestroyed

Rx Marble Design System
A design system to visualize functional reactive programming based on ReactiveExtensions
Stars: ✭ 60 (-36.84%)
Mutual labels:  rxjs
Time
A time driver designed to enable awesome testing and dev tooling
Stars: ✭ 80 (-15.79%)
Mutual labels:  rxjs
Cra Boilerplate
Up to date: This project is an Create React App - v2.1.1 boilerplate with integration of Redux, React Router, Redux thunk & Reactstrap(Bootstrap v4)
Stars: ✭ 87 (-8.42%)
Mutual labels:  rxjs
Ant Simple Pro
简洁,美观,快速上手,支持3大框架(vue3.0,react,angular,typescript);Concise, beautiful, quick to get started, support 3 big frameworks
Stars: ✭ 73 (-23.16%)
Mutual labels:  rxjs
Graphql Rxjs
fork of Graphql which adds Observable support
Stars: ✭ 78 (-17.89%)
Mutual labels:  rxjs
Jest Marbles
Helpers library for marbles testing with Jest
Stars: ✭ 85 (-10.53%)
Mutual labels:  rxjs
Js Boilerplate
Modern JavaScript Application Boilerplate
Stars: ✭ 57 (-40%)
Mutual labels:  rxjs
Sigi
Well designed effect management framework for complex frontend app
Stars: ✭ 95 (+0%)
Mutual labels:  rxjs
Reactivity
A Bleeding Edge React Universal Boilerplate for Power Users.
Stars: ✭ 79 (-16.84%)
Mutual labels:  rxjs
Rx Connect
Glue your state and pure React components with RxJS
Stars: ✭ 86 (-9.47%)
Mutual labels:  rxjs
Tibot
TiBot — The Date and Time Bot
Stars: ✭ 74 (-22.11%)
Mutual labels:  rxjs
Rxjs Book
rxjs-book 책 예제
Stars: ✭ 77 (-18.95%)
Mutual labels:  rxjs
Preact Redux Isomorphic
preact-redux-isomorphic PWA SPA SSR best practices and libraries in under 80kB page size (for live demo click the link below)
Stars: ✭ 85 (-10.53%)
Mutual labels:  rxjs
Reactive Flux
Fluxish model implemented with RxJS
Stars: ✭ 71 (-25.26%)
Mutual labels:  rxjs
Ngx Pwa Offline
RxJS operator and other utils catching offline errors in Angular apps (= async pipe everywhere!)
Stars: ✭ 94 (-1.05%)
Mutual labels:  rxjs
Angular1 Async Filter
Angular2 async pipe implemented as Angular 1 filter to handle promises & RxJS observables
Stars: ✭ 59 (-37.89%)
Mutual labels:  rxjs
Vist
Virtual-list component build with react and rxjs
Stars: ✭ 81 (-14.74%)
Mutual labels:  rxjs
Core
Reactive ORM for Lovefield
Stars: ✭ 95 (+0%)
Mutual labels:  rxjs
Complete Typescript Course
Contains the code for the Complete Typescript Course - Build a Node REST API
Stars: ✭ 94 (-1.05%)
Mutual labels:  rxjs
Jasmine Marbles
Marble testing helpers for RxJS and Jasmine
Stars: ✭ 85 (-10.53%)
Mutual labels:  rxjs

Build Status npm version

Unsubscribe from Observables in Angular

This library provides utility methods which help to unsubscribe from ReactiveX's Observables in Angular applications.

If you already use this library and want to use it with Angular 9: Please check the Migration Guide.

Why?

Failing to unsubscribe from observables will lead to unwanted memory leaks as the observable stream is left open, potentially even after a component has been destroyed or the user has navigated to another page.

Important: If services are used in Hierarchical Dependency Injectors they are affected by the same memory-leak issue!

This blog post provides additional information:

https://medium.com/thecodecampus-knowledge/the-easiest-way-to-unsubscribe-from-observables-in-angular-5abde80a5ae3

Patrons

❤️ W11K - The Web Engineers

❤️ theCodeCampus - Trainings for Angular and TypeScript

First: Check your Angular version!

If you are using Angular <= 8 or Angular 9 with ViewEngine instead of Ivy, you have to use a previous version of this library. Please see ViewEngine usage for further instructions. If you are using the latest Angular version and if you have no idea what ViewEngine or Ivy is, just continue with the instructions below.

Demo

@Component({
    selector: 'foo',
    templateUrl: './foo.component.html'
})
export class FooComponent 
            extends OnDestroyMixin                  // <--- 1. extend OnDestroyMixin 
            implements OnInit { 

    ngOnInit() {
        interval(1000)
            .pipe(
                untilComponentDestroyed(this)       // <--- 2. use the pipe operator
            )
            .subscribe();
  }

}

The TypeScript compiler will check that your component extends OnDestroyMixin when you try to use untilComponentDestroyed.

Installation

Download the NPM package

npm i --save @w11k/ngx-componentdestroyed

Usage

Prepare the class

Your component class must extend OnDestroyMixin:

import {OnDestroyMixin} from "@w11k/ngx-componentdestroyed";

@Component({
    selector: 'foo',
    templateUrl: './foo.component.html'
})
export class FooComponent extends OnDestroyMixin {  // <--- HERE 
    ...
}

Use the pipe operator

Either use

  • untilComponentDestroyed(this)
  • takeUntil(componentDestroyed(this))

as the last Observable pipe operator.

import {interval} from "rxjs";
import {takeUntil} from "rxjs/operators";
import {untilComponentDestroyed} from "@w11k/ngx-componentdestroyed";


interval(1000)
    .pipe(
        untilComponentDestroyed(this)               // <--- HERE
    )
    .subscribe();

Be careful with implementing ngOnDestroy()

If the component implements ngOnDestroy(), it must call super.ngOnDestroy() within the method body.

Migration guide 4.x.x -> 5.x.x

  1. The component class has to extend OnDestroyMixin (import from @w11k/ngx-componentdestroyed).
  2. If the component class has a constructor (very likely), you have to call super() at the beginning. The TypeScript compiler will complain if you don't.
  3. You must either remove the existing ngOnDestroy() method (if empty, recommended) or call super.ngOnDestroy() within.

TSLint rule

Our sister project @w11k/rx-ninja provides a TSLint rule to enforce the use a terminator operator. If you want to use untilComponentDestroyed(this) instead of takeUntil(componentDestroyed(this)) please add this configuration to your tslint.json file:

{
  "rulesDirectory": [
    "node_modules/@w11k/rx-ninja/dist/tslint_rules"
  ],
  "rules": {
    "rx-ninja-subscribe-takeuntil": [true, "takeUntil", "untilComponentDestroyed"]
  }
}

A note on Ivy, ViewEngine, AoT on/off, Karma, Jest, ...

We tried everything but the current state of Angular's Ivy compilation is a [email protected]#!ing nightmare:

  • Base classes do not work with ViewEngine
  • Ivy doesn't work with patching at runtime (this library version <= 4)
  • Decorator tricks rely on Angular internals and will break in the future ...
  • ... they don't work with Karma or Jest
  • ... but even if the don't break, they don't work with AoT compilation turned off
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].