2016-11-06 34 views
9

Ben bu yöntemle, basit bir onay iletişim servisi (Açısal 2) inşa:Subject.complete() tüm dinleyicilerin aboneliğini iptal ediyor mu?

confirm(body?: string, title?: string): Subject<void> { 
    this.confirmation = new Subject<void>(); 
    // ... show dialog here... "are you sure?" 
    return this.confirmation; 
} 

_onYesClicked() { 
    // ... closing the dialog 
    this.confirmation.next(); 
    this.confirmation.complete(); 
} 

_onNoClicked() { 
    // ... closing the dialog 
    this.confirmation.complete(); 
} 

Kullanımı: Birisi hizmetini kullanıyorsa

confirmationService.confirm().subscribe(() => alert("CONFIRMED")); 

, o Konu (bir gözlemlenebilir olan) iade alır ve "abone()" yapabilir. Abonelik "evet" tıklandığında çağrılır ve bu nedenle onay verilir ...

Bunu yapmanın doğru yolu bu mu? Ve daha da önemlisi ...

this.confirmation.complete(); 

çağrısı abone dinleyicileri abonelikten ve bu nedenle herhangi bir kalıcı referanslar (bellek sızıntısı) önleyecektir?

+0

Başlığı düzenledim çünkü "complete()" yöntemi, Obervable'ın arabiriminin bir parçası değil. –

cevap

13

Tüm Gözlemcileri sildiğinden emin olmak istiyorsanız, https://github.com/ReactiveX/rxjs/blob/master/src/Subject.ts#L82 numaralı telefondan kendiniz denetleyebilirsiniz. Tüm Gözlemcilerde complete()'u çağırır (Gözlemciler genellikle Observer interface'u uygulayan yalnızca aptal nesnelerdir) ve sonra this.observers.length = 0;'u ayarlar. Yani cevabı evet.

Yaklaşımınız geçerlidir, temel olarak Angular2 ile EventEmitter ile düzenli olarak aynıdır. İyileştirebildiğiniz tek şey, Subject s ifşa ederken asObservable()'u kullanmaya başlamaktır. Bu, altında bir Subject kullandığınızı ve yalnızca Gözlemlenebilir bir geri döndüğünüzü gizleyecektir. Bu şekilde, kullanıcılarınızın kazara (ya da yanlış anlamaya) izin vermemesine, Subject numaranızda next(), complete() ya da error() numaralarını aramayı deneyin.

Bellek sızıntısı ile ilgili olarak, bunun RxJS tarafından ele alınması gerekir, bu nedenle endişelenmenize gerek yok ve eğer bir sorun varsa, yazarlar bunu sizden önce fark edecektir.

+0

Ayrıca kullanıcı No (Hayır) tıklattığında tam() yerine error() işlevini çağırırdım. Veya Gözlemlemek yerine Promise kullanırdım. BTW, ng-bootstrap modellerinin ne yapıyor? –

+0

Hehehe ... bu dahiyane, sadece kaynağa bakarak - bu bana hiçbir referansın tutulmadığından kesinlikle emin olduğumu gösteriyor. Ayrıca "asObservable()" ile ilgili büyük tavsiye - Teşekkür ederim! – Wolfgang

+0

@JBNizet "Hayır" ı tıklamanın mutlaka bir hata anlamına gelmediğini düşünüyorum, ancak bu OP için benim için bir soru değil sanırım. – martin