Saat ini saya mulai dengan RxJs dan mencoba mendefinisikan modul yang mengembalikan yang dapat diamati. (setiap modul berfungsi sebagai kotak hitam dan hanya memperlihatkan yang dapat diamati). masalah utama saya adalah karena perpustakaan pihak ketiga yang saya gunakan : UWA : Semua elemen dom saya dihasilkan dari objek UWA dan memicu "acara" UWA. BTW saya ingin memetakan acara khusus itu ke yang dapat diamati. berikut adalah bagian dari struktur data acara:

tabBar = *somecode*...{
....
  onEndEditTab: function (callback) {
    return this.modelEvent.subscribe({
      event: endEditTabEvent
    }, callback);
  },....
}

Ini kode saya saat ini:

const tabBar = new tabBar();
tabBar.inject(domContainer);
const observer={
  next: (t) =>{
    const oldValue=t.target.textContent;
    const cbObservable = Rx.Observable.bindCallback(tabBar.onEndEditTab);
    //a new cbObservable is created at each dblclick event
    // (due to bindCallBack property which is to retern only one time.
    cbObservable .call(tabBar).subscribe(
      (v) => {
         console.log({oldLabel:oldValue,newLabel:v[0].button.label});
      }
    );          
Rx.Observable.fromEvent(tabBar, 'dblclick').subscribe(observer);

Kode ini berfungsi dan mencatat nilai lama dan baru setiap kali label tab diedit. Tetapi saat ini yang saya inginkan alih-alih hanya mencetak ini adalah untuk menggabungkan semua hasil itu menjadi aliran baru yang Dapat Diamati. menggunakan diagram marmer:

dblclick : ----(1)----(2)---....(n)->

(di mana ada nomor n yang tidak diketahui dari dblclick...) dipetakan ke:

cbObservable : ----(1:{old,new})--|
               ----(2:{old,new})--| 
               ....
               ----(n:{old,new})--|

Dan yang saya inginkan saat ini adalah:

outputStream : ----(1:{old,new})---(2:{old,new})--...(n:{old,new})--->

Di mana outputStream adalah panas yang dapat diamati; apakah ada cara untuk melakukan itu dengan semua kendala yang dijelaskan di atas? Terima kasih !

1
occimort 10 Agustus 2017, 19:20

2 jawaban

Jawaban Terbaik

Coba gunakan switchMap

Rx.Observable.fromEvent(tabBar, 'dblclick').switchMap(() => {
    const oldValue=t.target.textContent;
    return Rx.Observable.bindCallback(tabBar.onEndEditTab).map((v) => {
       return {old: oldValue, new: v[0]}
    });
})

Atau sesuatu seperti ini, lalu buat satu langganan untuk hasil yang dapat diamati

0
llCorvinuSll 14 Agustus 2017, 09:00

@llCorvinuSll : terima kasih atas jawaban Anda, setelah satu modifikasi sederhana berhasil :

Menambahkan call(yourObject) ke bindCallback ! bindCallback mengembalikan fungsi, jadi itu perlu dipanggil:

Rx.Observable.fromEvent(tabBar, 'dblclick').switchMap(() => {
    const oldValue=t.target.textContent;
    return Rx.Observable.bindCallback(tabBar.onEndEditTab).call(tabBar).map((v) => {
       return {old: oldValue, new: v[0]}
    });
})
0
occimort 16 Agustus 2017, 09:54