2016-02-10 44 views
5

Gecikmesinden sonra fare olayının hala etkin olup olmadığını kontrol etmek için Angular 2 kullanıyorum. Aşağıdaki olaylar konak bileşenine bağlı adres: Ben de iki etkinlikAçısal 2 RxJS

export class PopupDirective { 
    private _mouseEnterStream: EventEmitter<any> = new EventEmitter(); 
    private _mouseLeaveStream: EventEmitter<any> = new EventEmitter(); 

    onMouseEnter($event) { 
     this._mouseEnterStream.emit($event); 
    } 

    onMouseLeave($event) { 
     this._mouseLeaveStream.emit($event); 
    } 
} 

istediğim yönetmek için direktif iki dere ve dinleyici oluşturulan

host: { 
    '(mouseenter)': 'onMouseEnter($event)', 
    '(mouseleave)': 'onMouseLeave($event)' 
} 

benim yalnızca çağrılabilir subscribe için mouseenter olayı, sabit bir gecikmeden sonra aktiftir (yani, mouseleave oluşmamış). Bu şekilde yapmaya çalıştım, ama işe yaramıyor (mantıklı olanı, sadece nasıl tamir edeceğimi bilmiyorum).

this._mouseEnterStream.flatMap((e) => { 
    return Observable 
    .of(e) 
    .takeUntil(this._mouseLeaveStream); 
}).delay(2000).subscribe(
() => console.log('yay, it worked!') 
); 

Angular 2/RxJS deneyimine sahip olan herkes bunu nasıl ele almam gerektiğini biliyor mu?

+0

'geliyor this._mouseStream' kapsamaz:

Aksi Angular2 github bir öneri Rx kullanarak DOM olaylarını obsersables eklemek için basitçe yol var? GünterZöchbauer @ –

+0

Maalesef bu size Rx kullandığınız beri, gerçekten EventEmitters gerekmez btw mouseEnterStream – Harangue

+0

olmalıdır. Bunun yerine sadece Konuları kullanın. EventEmitters'ı Gözlemlenebilir olarak kullanabileceğiniz şaşıracaksınız, belki ng2 onları başlığın altına çevirir. – kakigoori

cevap

4

Günter'in yanıtı tam olarak beklediğiniz şeydir, ancak mevcut olmayan return yerine of işlecini kullanmalısınız.

this._mouseEnterStream.flatMap((e) => { 
    console.log('_mouseEnterStream.flatMap'); 
    return Observable 
     .of(e) 
     .delay(2000) 
     .takeUntil(this._mouseLeaveStream); 
}).subscribe(
    (e) => { 
    console.log('yay, it worked!'); 
    console.log(e); 
    } 
); 

gelen plunkr bakınız: https://plnkr.co/edit/vP3xRDXxFanqzLEKd3eo?p=preview. https://github.com/angular/angular/issues/4062

+0

Geri dönmek istediğiniz tek bir değer ise, '.just' daha mantıklı. Ancak Haskelly olmayan lang kullanıcıları için, anlamsız olabilir. – kakigoori

+1

Yorumunuz için teşekkürler, ancak bu operatör Rxjs 5.0.0-beta.0 ile mevcut değil. Bu hatayı görün: 'Rx_1.Observable.just bir işlev değil ' –

+0

Oh, üzgünüm, RxJS5 beta için taşıma belgelerinde listelenmiş gibi görünüyor. Üzgün ​​olsa da. – kakigoori

3

Ben TS kullanmak ya da kendimi (sadece Dart) RX Bu doğru sözdizimi veya eğer varsa, bu nedenle bilmiyorum yok How do I timeout an event in RxJS?

this.myStream = this._mouseEnterStream 
    .flatMap((e) => { 
     return Observable 
      .of(e) 
      .delay(2000) 
      .takeUntil(mouseLeaveStream); 
    }); 

myStream.subscribe((x) => { 
     console.log('onNext: ', x); 
}); 

oldukça benzer görünüyor operatörlerin adı Angular için mevcut ile maç.

+1

İlginç bir şekilde bu seçeneği tam olarak bu gönderiyi yapmadan önce denedim - ancak bir nedenden ötürü .susbcribe'in çalışmasını sağlamak için .flatMap'a bağlanması gerekir - aksi takdirde "sonraki" bir fare merkezi olayına derhal ateş eder. – Harangue