Saya tahu cara meningkatkan acara dengan EventEmitter. Saya juga dapat melampirkan metode untuk dipanggil jika saya memiliki komponen seperti ini:
<component-with-event (myevent)="mymethod($event)" />
Ketika saya memiliki komponen seperti ini, semuanya bekerja dengan baik. Saya memindahkan beberapa logika ke dalam sebuah layanan dan saya perlu memunculkan sebuah acara dari dalam Layanan. Apa yang saya lakukan adalah ini:
export class MyService {
myevent: EventEmitter = new EventEmitter();
someMethodThatWillRaiseEvent() {
this.myevent.next({data: 'fun'});
}
}
Saya memiliki komponen yang perlu memperbarui beberapa nilai berdasarkan acara ini tetapi sepertinya saya tidak dapat membuatnya berfungsi. Yang saya coba adalah ini:
//Annotations...
export class MyComponent {
constructor(myService: MyService) {
//myService is injected properly and i already use methods/shared data on this.
myService.myevent.on(... // 'on' is not a method <-- not working
myService.myevent.subscribe(.. // subscribe is not a method <-- not working
}
}
Bagaimana cara membuat MyComponent berlangganan ke acara jika layanan yang memunculkannya bukan merupakan komponen?
Saya menggunakan On 2.0.0-alpha.28
EDIT: Modifikasi "contoh kerja" saya menjadi benar-benar berfungsi, sehingga fokus dapat diletakkan pada bagian yang tidak berfungsi;)
Kode contoh: http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv
sumber
Jawaban:
Pembaruan : Saya telah menemukan cara yang lebih baik / tepat untuk memecahkan masalah ini menggunakan BehaviorSubject atau Observable daripada EventEmitter. Silakan lihat jawaban ini: https://stackoverflow.com/a/35568924/215945
Juga, dokumen Angular sekarang memiliki contoh buku masak yang menggunakan Subjek .
Jawaban asli / ketinggalan zaman / salah: sekali lagi, jangan gunakan EventEmitter dalam layanan . Itu adalah anti pola.
Menggunakan beta.1 ... NavService berisi EventEmiter. Komponen Navigasi memancarkan peristiwa melalui layanan, dan komponen ObservingComponent berlangganan peristiwa tersebut.
nav.service.ts
komponen
Plunker
sumber
providers: [NavService]
? Jika demikian, Anda akan mendapatkan beberapa contoh layanan.subscribe()
metode. Dengan menggunakan metode, kita dapat dengan mudah mengubah EventEmitter menjadi Subjek atau Observable, yang jauh lebih baik, karena sekarang kita telah mempelajari bahwa EventEmitters hanya boleh digunakan untuk properti Output. Cara yang tepat adalah menggunakan Subject, BehaviorSubject, atau Observable, dan biasanya kita langsung berlangganan ini, maka kita tidak memerlukan metode getNavChangeEmitter () lagi.Menggunakan alfa 28, saya berhasil berlangganan pemancar acara melalui
eventEmitter.toRx().subscribe(..)
metode ini. Karena tidak intuitif, mungkin berubah dalam rilis mendatang.sumber
click.toRx().subscribe(your_callback_function)