ডেলিগেশন: কৌনিক মধ্যে ইভেন্টইমিটার বা পর্যবেক্ষণযোগ্য


243

আমি কৌণিক মধ্যে একটি প্রতিনিধি প্যাটার্ন মত কিছু বাস্তবায়নের চেষ্টা করছি। যখন ব্যবহারকারী একটিতে ক্লিক করে nav-item, আমি এমন একটি ফাংশন কল করতে চাই যা এরপরে এমন একটি ইভেন্ট উত্সাহিত করে যা ঘটনাকে শোনার জন্য অন্য কোনও উপাদান দ্বারা পরিচালনা করা উচিত।

এই দৃশ্যটি এখানে: আমার একটি Navigationউপাদান রয়েছে:

import {Component, Output, EventEmitter} from 'angular2/core';

@Component({
    // other properties left out for brevity
    events : ['navchange'], 
    template:`
      <div class="nav-item" (click)="selectedNavItem(1)"></div>
    `
})

export class Navigation {

    @Output() navchange: EventEmitter<number> = new EventEmitter();

    selectedNavItem(item: number) {
        console.log('selected nav item ' + item);
        this.navchange.emit(item)
    }

}

এখানে পর্যবেক্ষণের উপাদানটি রয়েছে:

export class ObservingComponent {

  // How do I observe the event ? 
  // <----------Observe/Register Event ?-------->

  public selectedNavItem(item: number) {
    console.log('item index changed!');
  }

}

মূল প্রশ্নটি হল, পর্যবেক্ষণের উপাদানটি আমি কীভাবে প্রশ্নটিতে ঘটনাটি পর্যবেক্ষণ করব?


উত্তর:


449

২০১ 2016-০6-২ Ob আপডেট করুন: পর্যবেক্ষণযোগ্য ব্যবহারের পরিবর্তে, ব্যবহার করুন

  • @ আবদুল্লাহমান একটি মন্তব্যে বা সুপারিশ অনুসারে একটি আচরণমূলক বিষয় ject
  • @ জেসন গোয়েম্যাট একটি মন্তব্যে প্রস্তাবিত রিপ্লেসউবজেক্ট ject

একটি বিষয় উভয়ই পর্যবেক্ষণযোগ্য (যাতে আমরা এটি subscribe()করতে পারি) এবং একটি পর্যবেক্ষক (যাতে আমরা next()এটিতে একটি নতুন মান নির্গমন করতে বলতে পারি )। আমরা এই বৈশিষ্ট্যটি কাজে লাগাই। একটি বিষয় মানটিকে বহু পর্যবেক্ষকদের কাছে মাল্টিকাস্ট করার অনুমতি দেয়। আমরা এই বৈশিষ্ট্যটি কাজে লাগাই না (আমাদের কেবলমাত্র একটি পর্যবেক্ষক রয়েছে)।

বিহেভিয়ারসুবজেক্ট সাবজেক্টের একটি বৈকল্পিক। এটিতে "বর্তমান মান" ধারণাটি রয়েছে। আমরা এটি ব্যবহার করি: যখনই আমরা একটি পর্যবেক্ষণকারী উপাদান তৈরি করি, এটি স্বয়ংক্রিয়ভাবে আচরণবিধি থেকে বর্তমান নেভিগেশন আইটেমটির মান পাবে।

নীচের কোড এবং প্লাঙ্কার আচরণ আচরণ ব্যবহার করে।

রিপ্লেসউবজেক্ট হ'ল সাবজেক্টের আর একটি রূপ। আপনি যদি কোনও মান প্রকৃতপক্ষে উত্পাদিত না হওয়া পর্যন্ত অপেক্ষা করতে চান তবে ব্যবহার করুন ReplaySubject(1)। যখন কোনও আচরণ-সাবজেক্টের প্রাথমিক মান প্রয়োজন হয় (যা অবিলম্বে সরবরাহ করা হবে), রিপ্লেসউবজেক্টটি তা করে না। রিপ্লেসউবজেক্ট সর্বদা সর্বশেষতম মান সরবরাহ করবে, তবে এটির যে কোনও প্রাথমিক মান নেই তাই পরিষেবাটি প্রথম মানটি ফেরত দেওয়ার আগে কিছু অ্যাসিঙ্ক অপারেশন করতে পারে। এটি এখনও সাম্প্রতিকতম মান সহ পরবর্তী কলগুলিতে তত্ক্ষণাত্ জ্বলতে থাকবে। আপনি যদি কেবল একটি মান চান তবে first()সাবস্ক্রিপশনে ব্যবহার করুন। আপনি যদি ব্যবহার করেন তবে আপনার সদস্যতা বাতিল করতে হবে না first()

import {Injectable}      from '@angular/core'
import {BehaviorSubject} from 'rxjs/BehaviorSubject';

@Injectable()
export class NavService {
  // Observable navItem source
  private _navItemSource = new BehaviorSubject<number>(0);
  // Observable navItem stream
  navItem$ = this._navItemSource.asObservable();
  // service command
  changeNav(number) {
    this._navItemSource.next(number);
  }
}
import {Component}    from '@angular/core';
import {NavService}   from './nav.service';
import {Subscription} from 'rxjs/Subscription';

@Component({
  selector: 'obs-comp',
  template: `obs component, item: {{item}}`
})
export class ObservingComponent {
  item: number;
  subscription:Subscription;
  constructor(private _navService:NavService) {}
  ngOnInit() {
    this.subscription = this._navService.navItem$
       .subscribe(item => this.item = item)
  }
  ngOnDestroy() {
    // prevent memory leak when component is destroyed
    this.subscription.unsubscribe();
  }
}
@Component({
  selector: 'my-nav',
  template:`
    <div class="nav-item" (click)="selectedNavItem(1)">nav 1 (click me)</div>
    <div class="nav-item" (click)="selectedNavItem(2)">nav 2 (click me)</div>`
})
export class Navigation {
  item = 1;
  constructor(private _navService:NavService) {}
  selectedNavItem(item: number) {
    console.log('selected nav item ' + item);
    this._navService.changeNav(item);
  }
}

Plunker


মূল উত্তর একটি লক্ষণীয় ব্যবহার করে: (এটা আরো কোড এবং একটি BehaviorSubject ব্যবহার না করে যুক্তিবিজ্ঞান প্রয়োজন, সেই কারণে আমি এটা বলতে না, কিন্তু এটা শিক্ষামূলক হতে পারে)

সুতরাং, এখানে এমন একটি বাস্তবায়ন রয়েছে যা ইভেন্টএমিটারের পরিবর্তে একটি পর্যবেক্ষণযোগ্য ব্যবহার করে । আমার ইভেন্টইমিটার বাস্তবায়নের বিপরীতে, এই বাস্তবায়নটি বর্তমানে navItemপরিষেবায় নির্বাচিত বর্তমানে সঞ্চিত করে , যাতে যখন একটি পর্যবেক্ষণকারী উপাদান তৈরি করা হয়, তখন এটি API কলের মাধ্যমে বর্তমান মানটি পুনরুদ্ধার করতে navItem()পারে এবং তারপরে navChange$পর্যবেক্ষণযোগ্য মাধ্যমে পরিবর্তনের বিষয়ে অবহিত হতে পারে ।

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/share';
import {Observer} from 'rxjs/Observer';

export class NavService {
  private _navItem = 0;
  navChange$: Observable<number>;
  private _observer: Observer;
  constructor() {
    this.navChange$ = new Observable(observer =>
      this._observer = observer).share();
    // share() allows multiple subscribers
  }
  changeNav(number) {
    this._navItem = number;
    this._observer.next(number);
  }
  navItem() {
    return this._navItem;
  }
}

@Component({
  selector: 'obs-comp',
  template: `obs component, item: {{item}}`
})
export class ObservingComponent {
  item: number;
  subscription: any;
  constructor(private _navService:NavService) {}
  ngOnInit() {
    this.item = this._navService.navItem();
    this.subscription = this._navService.navChange$.subscribe(
      item => this.selectedNavItem(item));
  }
  selectedNavItem(item: number) {
    this.item = item;
  }
  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

@Component({
  selector: 'my-nav',
  template:`
    <div class="nav-item" (click)="selectedNavItem(1)">nav 1 (click me)</div>
    <div class="nav-item" (click)="selectedNavItem(2)">nav 2 (click me)</div>
  `,
})
export class Navigation {
  item:number;
  constructor(private _navService:NavService) {}
  selectedNavItem(item: number) {
    console.log('selected nav item ' + item);
    this._navService.changeNav(item);
  }
}

Plunker


আরও দেখুন কম্পোনেন্ট মিথস্ক্রিয়া Cookbook উদাহরণ , যা একটি ব্যবহার Subjectobservables ছাড়াও। যদিও উদাহরণটি "পিতামাতার এবং শিশুদের যোগাযোগ", একই কৌশল অবাস্তব উপাদানগুলির জন্য প্রযোজ্য।


3
এটি Angular2 ইস্যুতে বারবার উল্লেখ করা হয়েছিল যে EventEmitterআউটপুট ব্যতীত অন্য কোথাও ব্যবহার করতে নিরুৎসাহিত করা হয়েছে । এই অনুশীলনকে উত্সাহিত করতে তারা বর্তমানে টিউটোরিয়ালগুলি (সার্ভার যোগাযোগ যোগাযোগ AFAIR) পুনর্লিখন করছে rit
গন্টার জ্যাচবাউয়ার

2
উপরের নমুনা কোডটিতে নেভিগেশন উপাদানটির মধ্যে থেকে কোনও পরিষেবা কীভাবে শুরু করার এবং প্রথম ইভেন্ট বন্ধ করার কোনও উপায় আছে? সমস্যাটি হ'ল নেভিগেশন উপাদানটি কল _observerকরার সময় পরিষেবা অবজেক্টটি কমপক্ষে শুরু হয় না ngOnInit()
কমফ্রিচ

4
আমি পর্যবেক্ষণের পরিবর্তে আচরণ আচরণের পরামর্শ দিতে পারি suggest এটি EventEmitter"হট" যার অর্থ এটি ইতিমধ্যে "ভাগ", এটি বর্তমান মান সংরক্ষণ করার জন্য ডিজাইন করা হয়েছে এবং অবশেষে এটি পর্যবেক্ষক এবং পর্যবেক্ষক উভয়ই প্রয়োগ করে যা আপনাকে কমপক্ষে পাঁচটি লাইন কোড এবং দুটি বৈশিষ্ট্য সাশ্রয় করতে পারে
আব্দুলরাহমান এছাড়াওঘেয়ের

2
@ পঙ্কজপার্কার, "কীভাবে পরিবর্তন সনাক্তকরণ ইঞ্জিন জানে যে পরিবর্তন পর্যবেক্ষণযোগ্য বস্তুর উপরে ঘটেছে" সম্পর্কিত বিষয়ে - আমি আমার আগের মন্তব্যের প্রতিক্রিয়া মুছে ফেলেছি। আমি সম্প্রতি শিখেছি যে কৌণিকর বানর-প্যাচ দেয় না subscribe(), তাই এটি যখন পর্যবেক্ষণযোগ্য পরিবর্তন হয় তা সনাক্ত করতে পারে না। সাধারণত, এখানে কিছু অ্যাসিঙ্ক ইভেন্ট রয়েছে যা (আমার স্যাম্পল কোডে এটি বোতাম ক্লিক ইভেন্টগুলি) আগুন ধরিয়ে দেয় এবং সম্পর্কিত কলব্যাকটি পর্যবেক্ষণযোগ্য অবস্থায় পরবর্তী () কল করবে। তবে পরিবর্তন সনাক্তকরণ অ্যাসিঙ্ক ইভেন্টের কারণে, পর্যবেক্ষণযোগ্য পরিবর্তনের কারণে নয় runs আরও দেখুন গুন্টার মন্তব্য করেছেন: stackoverflow.com/a/36846501/215945
মার্ক Rajcok

9
আপনি যদি কোনও মান প্রকৃতপক্ষে উত্পাদিত না হওয়া পর্যন্ত অপেক্ষা করতে চান তবে আপনি ব্যবহার করতে পারেন ReplaySubject(1)। একটি BehaviorSubjectইনিশিয়াল মান যা তখনি প্রদান করা হবে প্রয়োজন। ReplaySubject(1)সবসময় সাম্প্রতিকতম মান প্রদান করা হবে, কিন্তু ইনিশিয়াল মূল্য বা মানে দরকার তাই সেবা এটা প্রথম মান ফেরার আগে কিছু ASYNC অপারেশন করতে পারি না নেই, কিন্তু এখনও শেষ মান পরবর্তী কল হবার সঙ্গে সঙ্গে আগুন। আপনি যদি কেবলমাত্র একটি মানতে আগ্রহী হন তবে আপনি first()সাবস্ক্রিপশনটিতে ব্যবহার করতে পারেন এবং শেষে সদস্যতা বাতিল করতে হবে না কারণ এটি সম্পূর্ণ হবে।
জেসন গোয়েমাত

33

ব্রেকিং নিউজ: আমি আরও একটি উত্তর যুক্ত করেছি যা ইভেন্টএমিটারের পরিবর্তে একটি পর্যবেক্ষণযোগ্য ব্যবহার করে। আমি এই এক উত্তর যে সুপারিশ। এবং প্রকৃতপক্ষে কোনও পরিষেবাতে ইভেন্টএমিটার ব্যবহার করা খারাপ অভ্যাস


আসল উত্তর: (এটি করবেন না)

ইভেন্টএমিটারকে একটি পরিষেবাতে রাখুন, যা পর্যবেক্ষণকারী উপাদানটিকে ইভেন্টটিতে সরাসরি সাবস্ক্রাইব করতে (এবং সাবস্ক্রাইব) করতে দেয় :

import {EventEmitter} from 'angular2/core';

export class NavService {
  navchange: EventEmitter<number> = new EventEmitter();
  constructor() {}
  emit(number) {
    this.navchange.emit(number);
  }
  subscribe(component, callback) {
    // set 'this' to component when callback is called
    return this.navchange.subscribe(data => call.callback(component, data));
  }
}

@Component({
  selector: 'obs-comp',
  template: 'obs component, index: {{index}}'
})
export class ObservingComponent {
  item: number;
  subscription: any;
  constructor(private navService:NavService) {
   this.subscription = this.navService.subscribe(this, this.selectedNavItem);
  }
  selectedNavItem(item: number) {
    console.log('item index changed!', item);
    this.item = item;
  }
  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

@Component({
  selector: 'my-nav',
  template:`
    <div class="nav-item" (click)="selectedNavItem(1)">item 1 (click me)</div>
  `,
})
export class Navigation {
  constructor(private navService:NavService) {}
  selectedNavItem(item: number) {
    console.log('selected nav item ' + item);
    this.navService.emit(item);
  }
}

আপনি যদি চেষ্টা করেন তবে Plunkerএই পদ্ধতির বিষয়ে আমি পছন্দ করি না এমন কয়েকটি জিনিস রয়েছে:

  • পর্যবেক্ষণকারী উপাদানটি ধ্বংস হয়ে যাওয়ার পরে সদস্যতা বাতিল করতে হবে
  • আমরা উপাদানটি পাস করতে হবে subscribe() যাতে thisকলব্যাক কল করার সময় যথাযথ সেট হয়ে যায়

আপডেট: দ্বিতীয় বিকল্পটি সমাধান করে এমন বিকল্প হ'ল পর্যবেক্ষণকারী navchangeউপাদান সরাসরি ইভেন্টইমিটার সম্পত্তিটিতে সাবস্ক্রাইব করে রাখবে:

constructor(private navService:NavService) {
   this.subscription = this.navService.navchange.subscribe(data =>
     this.selectedNavItem(data));
}

আমরা যদি সরাসরি সাবস্ক্রাইব করি, তবে আমাদের subscribe()নাভিসোর্সিতে পদ্ধতিটির প্রয়োজন হবে না ।

নাভসওয়ারসিকে কিছুটা আরও ক্যাপসুলেটেড করতে, আপনি একটি getNavChangeEmitter()পদ্ধতি যুক্ত করতে পারেন এবং এটি ব্যবহার করতে পারেন:

getNavChangeEmitter() { return this.navchange; }  // in NavService

constructor(private navService:NavService) {  // in ObservingComponent
   this.subscription = this.navService.getNavChangeEmitter().subscribe(data =>
     this.selectedNavItem(data));
}

আমি মিঃ জুবাবি প্রদত্ত উত্তরের এই সমাধানটিকেই প্রাধান্য দিচ্ছি, তবে সত্যবাদী হওয়ার জন্য আমিও এই সমাধানটির অনুরাগী নই। আমি ধ্বংসের উপর সাবস্ক্রাইব করার বিষয়ে চিন্তা করি না, তবে আমি সত্যটি ঘৃণা করি যে ইভেন্টটি সাবস্ক্রাইব করতে আমাদের উপাদানটি পাস করতে হবে ...
the_critic

আমি আসলে এটি সম্পর্কে ভেবেছিলাম এবং এই সমাধানটি নিয়ে যাওয়ার সিদ্ধান্ত নিয়েছি। আমি কিছুটা ক্লিনার সমাধান করতে চাই, তবে আমি নিশ্চিত নই যে এটি সম্ভব (অথবা আমি সম্ভবত আরও সুন্দর কিছু বলব যা আমি বলার অপেক্ষা রাখে না)।
the_critic

আসলে ২ য় বুলেট সমস্যাটি হ'ল পরিবর্তে ফাংশনের একটি রেফারেন্স পাশ করা হচ্ছে। ঠিক করতে: this.subscription = this.navService.subscribe(() => this.selectedNavItem());এবং সাবস্ক্রাইব করতে:return this.navchange.subscribe(callback);
আন্দ্রে ওয়ার্ল্যাং

1

যদি কেউ প্রোগ্রামিংয়ের আরও প্রতিক্রিয়াশীল ভিত্তিক স্টাইল অনুসরণ করতে চায়, তবে অবশ্যই "সবকিছুই একটি প্রবাহ" ধারণাটি চিত্রের মধ্যে আসে এবং তাই, যতক্ষণ সম্ভব এই স্ট্রিমগুলি মোকাবেলা করার জন্য অবজার্ভেবলগুলি ব্যবহার করুন।


1

আপনি যে কোনটি ব্যবহার করতে পারেন:

  1. আচরণের বিষয়:

বিহেভিয়ারসুবজেক্ট এক প্রকারের বিষয়, একটি বিষয় একটি বিশেষ ধরণের পর্যবেক্ষণযোগ্য যা পর্যবেক্ষক এবং পর্যবেক্ষক হিসাবে কাজ করতে পারে যে আপনি অন্য পর্যবেক্ষণযোগ্য এবং সাবস্ক্রিপশনের মতো বার্তাগুলির সাবস্ক্রাইব করতে পারেন, এটি উত্স পর্যবেক্ষণযোগ্য দ্বারা নির্গত বিষয়টির শেষ মানটি প্রদান করে:

সুবিধা: উপাদানগুলির মধ্যে ডেটা পাস করার জন্য পিতা-সন্তানের সম্পর্কের মতো কোনও সম্পর্ক নেই।

এনএভি সার্ভিস

import {Injectable}      from '@angular/core'
import {BehaviorSubject} from 'rxjs/BehaviorSubject';

@Injectable()
export class NavService {
  private navSubject$ = new BehaviorSubject<number>(0);

  constructor() {  }

  // Event New Item Clicked
  navItemClicked(navItem: number) {
    this.navSubject$.next(number);
  }

 // Allowing Observer component to subscribe emitted data only
  getNavItemClicked$() {
   return this.navSubject$.asObservable();
  }
}

নেভিগেশন কম্পোনেন্ট

@Component({
  selector: 'navbar-list',
  template:`
    <ul>
      <li><a (click)="navItemClicked(1)">Item-1 Clicked</a></li>
      <li><a (click)="navItemClicked(2)">Item-2 Clicked</a></li>
      <li><a (click)="navItemClicked(3)">Item-3 Clicked</a></li>
      <li><a (click)="navItemClicked(4)">Item-4 Clicked</a></li>
    </ul>
})
export class Navigation {
  constructor(private navService:NavService) {}
  navItemClicked(item: number) {
    this.navService.navItemClicked(item);
  }
}

নিরীক্ষণ সংস্থা

@Component({
  selector: 'obs-comp',
  template: `obs component, item: {{item}}`
})
export class ObservingComponent {
  item: number;
  itemClickedSubcription:any

  constructor(private navService:NavService) {}
  ngOnInit() {

    this.itemClickedSubcription = this.navService
                                      .getNavItemClicked$
                                      .subscribe(
                                        item => this.selectedNavItem(item)
                                       );
  }
  selectedNavItem(item: number) {
    this.item = item;
  }

  ngOnDestroy() {
    this.itemClickedSubcription.unsubscribe();
  }
}

দ্বিতীয় পন্থা হয় Event Delegation in upward direction child -> parent

  1. @ ইনপুট এবং @ আউটপুট সাজসজ্জার ব্যবহার করে পিতা সন্তানের উপাদান এবং শিশুকে পিতামাতার উপাদানকে অবহিত করার ডেটা পাস করা

উদাহরণস্বরূপ @ আশিষ শর্মা প্রদত্ত উত্তর


0

আপনাকে অবজার্ভিং কম্পোনেন্টের টেমপ্লেটে নেভিগেশন উপাদানটি ব্যবহার করতে হবে (কোনও নির্বাচক যুক্ত করতে ভুলবেন না করতে .. প্রাক্তন জন্য নেভিগেশন-উপাদান)

<navigation-component (navchange)='onNavGhange($event)'></navigation-component>

এবং অবজারভিং কম্পোনেন্টে ন্যাভজেঞ্জ () প্রয়োগ করুন

onNavGhange(event) {
  console.log(event);
}

শেষ কথা .. আপনার কাছে কম্পিউটার কমেন্টে ইভেন্ট অ্যাট্রিবিউট লাগবে না

events : ['navchange'], 

এটি কেবল অন্তর্নিহিত উপাদানগুলির জন্য একটি ইভেন্ট সন্ধান করে। আমি যা করার চেষ্টা করছি তা নয়। আমি সবেমাত্র (^ নেভিগেশন) (ক্যারেটটি ইভেন্ট বুদ্বুদার জন্য) এর মতো কিছু বলতে nav-itemপারি তবে আমি কেবল এমন একটি ইভেন্ট ছড়িয়ে দিতে চাই যা অন্যরা পালন করতে পারে।
the_critic

আপনি নাভিচেন.টোআরএক্স () সাবস্ক্রাইব () ব্যবহার করতে পারেন .. তবে আপনার অবজার্ভিং
কম্পোনেন্ট

0

আপনি উপরে বর্ণিত হিসাবে BehaviourSubject ব্যবহার করতে পারেন বা আরও একটি উপায় আছে:

আপনি এইভাবে ইভেন্টএমিটার পরিচালনা করতে পারেন: প্রথমে একজন নির্বাচক যুক্ত করুন

import {Component, Output, EventEmitter} from 'angular2/core';

@Component({
// other properties left out for brevity
selector: 'app-nav-component', //declaring selector
template:`
  <div class="nav-item" (click)="selectedNavItem(1)"></div>
`
 })

 export class Navigation {

@Output() navchange: EventEmitter<number> = new EventEmitter();

selectedNavItem(item: number) {
    console.log('selected nav item ' + item);
    this.navchange.emit(item)
}

}

এখন আপনি এই ইভেন্টটির মতো পরিচালনা করতে পারেন যেমন ধরুন আমরা পর্যবেক্ষক ডটকমপিটিএনটিএইচটিএমএল পর্যবেক্ষক উপাদানটির ভিউ

<app-nav-component (navchange)="recieveIdFromNav($event)"></app-nav-component>

তারপরে অবজার্ভিং কম্পোনেন্ট.স.

export class ObservingComponent {

 //method to recieve the value from nav component

 public recieveIdFromNav(id: number) {
   console.log('here is the id sent from nav component ', id);
 }

 }

-2

আমি রিঅ্যাকটিভেক্স না পরিষেবা ব্যবহার না করেই এই মামলার আর একটি সমাধান খুঁজে পেয়েছি। আমি আসলে আরএক্সজেএক্স এপিআই পছন্দ করি তবে আমার মনে হয় অ্যাসিঙ্ক এবং / অথবা জটিল ফাংশন সমাধান করার সময় এটি সবচেয়ে ভাল হয়। এটি সেভাবে ব্যবহার করা, এটি আমার কাছে ছাড়িয়ে গেছে।

আমার মনে হয় আপনি কী খুঁজছেন তা একটি সম্প্রচারের জন্য। হ্যাঁ ওটাই. এবং আমি এই সমাধানটি খুঁজে পেয়েছি:

<app>
  <app-nav (selectedTab)="onSelectedTab($event)"></app-nav>
       // This component bellow wants to know when a tab is selected
       // broadcast here is a property of app component
  <app-interested [broadcast]="broadcast"></app-interested>
</app>

 @Component class App {
   broadcast: EventEmitter<tab>;

   constructor() {
     this.broadcast = new EventEmitter<tab>();
   }

   onSelectedTab(tab) {
     this.broadcast.emit(tab)
   }    
 }

 @Component class AppInterestedComponent implements OnInit {
   broadcast: EventEmitter<Tab>();

   doSomethingWhenTab(tab){ 
      ...
    }     

   ngOnInit() {
     this.broadcast.subscribe((tab) => this.doSomethingWhenTab(tab))
   }
 }

এটি সম্পূর্ণ কাজের উদাহরণ: https://plnkr.co/edit/xGVuFBOpk2GP0pRBImsE


1
সেরা উত্তরের দিকে তাকান, এটি সাবস্ক্রাইব পদ্ধতিটিও ব্যবহার করে .. আসলে আজকাল আমি উপাদানগুলির মধ্যে এই যোগাযোগ সমস্যা সমাধানের জন্য রেডাক্স বা অন্য কোনও রাষ্ট্র নিয়ন্ত্রণ ব্যবহার করার পরামর্শ দেব। এটি অতিরিক্ত জটিলতার সাথে যুক্ত হওয়া সত্ত্বেও এটি অন্য যে কোনও সমাধানের তুলনায় অনেক বেশি ভাল। হয় কৌণিক 2 উপাদান ইভেন্ট হ্যান্ডলার সিনট্যাক্স ব্যবহার করে বা স্পষ্টভাবে সাবস্ক্রাইব পদ্ধতি ব্যবহার করে ধারণাটি একই থাকে। আমার চূড়ান্ত চিন্তাভাবনাগুলি হ'ল যদি আপনি এই সমস্যার জন্য রেডাক্স ব্যবহারের একটি নির্দিষ্ট সমাধান চান তবে অন্যথায় ইভেন্ট ইমিটারের সাথে পরিষেবাগুলি ব্যবহার করুন।
নিকোলাস মার্কাচিনি আগস্টো

সাবস্ক্রাইব বৈধ হয় যতক্ষণ না কৌনিকটি পর্যবেক্ষণযোগ্য সত্যটিকে সরিয়ে না দেয়। .subscribe () সেরা উত্তরে ব্যবহৃত হয়, তবে সেই নির্দিষ্ট বস্তুর উপরে নয়।
Porschiey
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.