কৌনিক 4+ ngOnDestroy () পরিষেবাতে - পর্যবেক্ষণযোগ্য ধ্বংস করুন


106

একটি কৌণিক অ্যাপ্লিকেশনটিতে আমাদের ngOnDestroy()একটি উপাদান / নির্দেশকের জন্য লাইফসাইकल হুক রয়েছে এবং আমরা পর্যবেক্ষণকারীদের সদস্যতা ত্যাগ করার জন্য এই হুকটি ব্যবহার করি।

আমি কোনও @injectable()পরিষেবাতে তৈরি হওয়া পর্যবেক্ষণযোগ্য / গন্তব্য পরিষ্কার করতে চাই । আমি কিছু পোস্ট দেখেছি যা সেবারও ngOnDestroy()ব্যবহৃত হতে পারে।

তবে, এটি কি একটি ভাল অনুশীলন এবং এটি করার একমাত্র উপায় এবং কখন এটি ডাকা হবে? কেউ দয়া করে পরিষ্কার করুন।

উত্তর:


125

অনডেস্ট্রয় লাইফাইসাইকেল হুক সরবরাহকারীদের মধ্যে উপলব্ধ। ডক্স অনুসারে:

নির্দেশিকা, পাইপ বা পরিষেবা নষ্ট হয়ে গেলে লাইফাইসাইকেল হুক বলা হয়।

এখানে একটি উদাহরণ :

@Injectable()
class Service implements OnDestroy {
  ngOnDestroy() {
    console.log('Service destroy')
  }
}

@Component({
  selector: 'foo',
  template: `foo`,
  providers: [Service]
})
export class Foo implements OnDestroy {
  constructor(service: Service) {}

  ngOnDestroy() {
    console.log('foo destroy')
  }
}

@Component({
  selector: 'my-app',
  template: `<foo *ngIf="isFoo"></foo>`,
})
export class App {
  isFoo = true;

  constructor() {
    setTimeout(() => {
        this.isFoo = false;
    }, 1000)
  }
}

লক্ষ্য করুন যে উপরের Serviceকোডটিতে এমন একটি উদাহরণ রয়েছে যা Fooউপাদানটির সাথে সম্পর্কিত, তাই ধ্বংস হয়ে গেলে Fooএটি ধ্বংস করা যায়।

মূল ইঞ্জেক্টরের সাথে সরবরাহকারীদের ক্ষেত্রে এটি অ্যাপ্লিকেশন নষ্ট হওয়ার পরে ঘটবে, এটি একাধিক বুটস্ট্র্যাপের সাহায্যে মেমরির ফাঁস এড়াতে সহায়ক, যেমন পরীক্ষায়।

যখন প্যারেন্ট ইনজেক্টর থেকে কোনও সরবরাহকারী চাইল্ড উপাদানটিতে সাবস্ক্রাইব হন, তখন এটি উপাদান উপাদান ধ্বংস করে ধ্বংস করা হবে না, এটি উপাদানটির সদস্যতা বাতিল করার উপাদানটির দায়িত্ব ngOnDestroyanother


না class Service implements OnDestroy? এবং মডিউল স্তরে যদি পরিষেবা সরবরাহ করা হয় তবে এই কী বলা হয় তা আপনি কী মনে করেন
শুইমেল

4
implements OnDestroyকিছুই প্রভাবিত করে না তবে সম্পূর্ণতার জন্য যুক্ত করা যেতে পারে। যখন একটি মডিউল ধ্বংস করা হয় এটা বলা হবে, মত appModule.destroy()। এটি একাধিক অ্যাপ প্রারম্ভিককরণের জন্য দরকারী হতে পারে।
এস্তাস ফ্লাস্ক

4
পরিষেবাগুলি ব্যবহার করে এমন প্রতিটি উপাদানগুলির জন্য কি সাবস্ক্রাইব প্রয়োজনীয়?
আলী আব্বাসজাদে

4
প্লাঙ্কার আমার পক্ষে কাজ করছিল না, সুতরাং উদাহরণের একটি স্ট্যাকব্লিটজ সংস্করণ এখানে রয়েছে: stackblitz.com/edit/angular-mggk9b
compuguru

4
এটি বুঝতে আমার কিছুটা সমস্যা হয়েছিল। কিন্তু এই আলোচনায় আমাকে স্থানীয় এবং বিশ্ব সেবা মধ্যে পার্থক্য বুঝতে সাহায্য করেছে stackoverflow.com/questions/50056446/... আপনি "পরিষ্কার আপ" আছে বা না আপনার পরিষেবার সুযোগ থেকে নির্ভর করে, আমি মনে করি কি না।
জেসমিন

27

আপনার পরিষেবাতে একটি পরিবর্তনশীল তৈরি করুন

subscriptions: Subscriptions[]=[];

আপনার প্রতিটি সাবস্ক্রাইব হিসাবে ধাক্কা

this.subscriptions.push(...)

একটি dispose()পদ্ধতি লিখুন

dispose(){
this.subscriptions.forEach(subscription =>subscription.unsubscribe())

এনজিওনডেস্ট্রয়ের সময় আপনার উপাদান থেকে এই পদ্ধতিটি কল করুন

ngOnDestroy(){
   this.service.dispose();
 }

ধন্যবাদ তোমার উত্তরের জন্য. এই ngOnDestroy ডাকা হবে যখন আমাদের কোন ধারণা আছে? ?
এম্পারলে

হ্যাঁ নির্দেশিকা বা উপাদানটি বিনষ্ট হওয়ার আগে এটি একটি ক্লিনআপ কল বলে। তবে আমি কেবল বুঝতে চাই যে এটি পরিষেবাটির জন্যও প্রযোজ্য কিনা?
এম্পারলে

মডিউলটি লোড করার পরে কোনও পরিষেবা সাফ হবে না
আরাভিন্ড ২

4
জীবনচক্র হুকের জন্য প্রযোজ্য নয়@injectables
অরবিন্দ

@Aravind আমি নিশ্চিত তারা যখন চালু হয় নই কিন্তু তারা
এস্তাস ফ্লাস্ক

11

আমি takeUntil(onDestroy$)পাইপযোগ্য অপারেটরদের দ্বারা সক্ষম এই প্যাটার্নটিকে পছন্দ করি । আমি পছন্দ করি যে এই প্যাটার্নটি আরও সংক্ষিপ্ত, আরও পরিষ্কার এবং এটি OnDestroyলাইফেসাইকেলের হুক প্রয়োগের সময় সাবস্ক্রিপশন মারার অভিপ্রায়টি স্পষ্টভাবে জানায় ।

এই নিদর্শন পরিষেবাগুলির পাশাপাশি ইনজেকশন পর্যবেক্ষণে সাবস্ক্রাইব করার উপাদানগুলির জন্যও কাজ করে। নীচের কঙ্কাল কোডটি আপনার নিজস্ব সেবারে নিদর্শনকে সংহত করার জন্য আপনাকে যথেষ্ট বিশদ দিতে হবে। কল্পনা করুন আপনি একটি পরিষেবা আমদানি করছেন InjectedService...

import { InjectedService } from 'where/it/lives';
import { Injectable, OnDestroy } from '@angular/core';
import { Observable } from 'rxjs/Rx';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs/Subject';

@Injectable()
export class MyService implements OnDestroy {

  private onDestroy$ = new Subject<boolean>();

  constructor(
    private injectedService: InjectedService
  ) {
    // Subscribe to service, and automatically unsubscribe upon `ngOnDestroy`
    this.injectedService.observableThing().pipe(
      takeUntil(this.onDestroy$)
    ).subscribe(latestTask => {
      if (latestTask) {
        this.initializeDraftAllocations();
      }
    });
  }

  ngOnDestroy() {
    this.onDestroy$.next(true);
    this.onDestroy$.complete();
  }

কখন / কীভাবে সাবস্ক্রাইব করবেন সে বিষয়টি এখানে ব্যাপকভাবে কভার করা হয়েছে: কৌণিক / আরএক্সজেস কখন আমাকে `সাবস্ক্রিপশন` থেকে সাবস্ক্রাইব করা উচিত?


5

কেবল স্পষ্ট করে বলতে - আপনাকে ধ্বংস করার দরকার নেই Observablesতবে কেবল তাদের সাবস্ক্রিপশন তৈরি করা হবে।

দেখে মনে হচ্ছে অন্যরাও নির্দেশ করেছে যে আপনি এখন ngOnDestroyপরিষেবাগুলির সাথেও ব্যবহার করতে সক্ষম হচ্ছেন। লিঙ্ক: https://angular.io/api/core/OnDestroy


4
আপনি কি দয়া করে এ সম্পর্কে আরও বিস্তারিত বলতে পারেন
অরবিন্দ

2

টোকেন ব্যবহার করে সতর্কতা অবলম্বন করুন

আমার অ্যাপ্লিকেশনটিকে যতটা সম্ভব মডুলার করার চেষ্টা করার জন্য আমি প্রায়শই কোনও উপাদানকে পরিষেবা সরবরাহ করতে সরবরাহকারী টোকেন ব্যবহার করব। দেখে মনে হচ্ছে এগুলি তাদের ngOnDestroyপদ্ধতিগুলি কল করে না :-(

যেমন

export const PAYMENTPANEL_SERVICE = new InjectionToken<PaymentPanelService>('PAYMENTPANEL_SERVICE');

একটি উপাদান একটি সরবরাহকারী বিভাগ সহ:

 {
     provide: PAYMENTPANEL_SERVICE,
     useExisting: ShopPaymentPanelService
 }

উপাদানটি নিষ্পত্তি হলে আমার পদ্ধতিতে কল ShopPaymentPanelServiceহয় না ngOnDestroy। আমি এই কঠিন উপায় খুঁজে পেয়েছি!

এর সাথে একযোগে পরিষেবা সরবরাহ করা একটি কর্মপরিকল্পনা useExisting

[
   ShopPaymentPanelService,

   {
       provide: PAYMENTPANEL_SERVICE,
       useExisting: ShopPaymentPanelService
   }
]

যখন আমি এটি করেছি ngOnDisposeপ্রত্যাশিত হিসাবে ডাকা হয়েছিল।

এটি কোনও বাগ বা না হলেও নিশ্চিত না তবে খুব অপ্রত্যাশিত।


দুর্দান্ত ইঙ্গিত! আমি ভাবছিলাম কেন এটি আমার ক্ষেত্রে কাজ করছে না (কংক্রিট বাস্তবায়নের জন্য আমি বিমূর্ত ক্লাস-ইন্টারফেসটি ব্যবহার করছি)।
আন্দ্রে সিনিটসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.