2017-03-09 35 views
6

Bellek sızıntılarını önlemek için Bileşenler yok olduğunda Gözlemlenebilir (yani: sonsuz değerine sahip Gözlemlenebilir öğeler) aboneliği iptal etmem gerektiğini anlıyorum. sonlu Gözlemcileri otomatik olarak tamamlayacak ve otomatik olarak unsubscribe yapacaktır.Köşeli 2/Rxjs: Abonelikten çıkmam gerekiyor mu?

Ama oluşturursanız bir benim bileşenindeObservable (örneğin FormGroup.valueChanges veya QueryList.changes için), bu bir onu içeren bileşen ile yok edilecek, bu yüzden hiçbir bellek sızıntısı bile olacak düşünüyorum sonsuz 'un aboneliğini iptal edemem. Ben unsubscribethis.form.valueChanges dan do, İşte

@Component({}) 
export class DummyComponent { 
    form: FormGroup; 

    constructor(private fb: FormBuilder) { 
     this.form = this.fb.group({ 
      firstName: [''], 
      lastName: [''] 
     }); 
     this.form.valueChanges.subscribe(
      x => console.log(x) 
     ); 
    } 
} 

;: Burada

basit bir örnek Bileşenim yok edildiğinde, this.form.valueChanges da imha edilecek.

Bu durumda bir bellek sızıntısı olacak mı?

+3

Abone olmak için (...) tam bir geri arama eklemeye ve bileşen yok olduğunda çağrılıp çağrılmadığını kontrol etmeye çalıştınız mı? –

+0

Ben yaptım ve buna (Ben sadece bu.form.valueChanges' ile test yaptım) denir. – freedonaab

+0

Sanırım abonelikten çıkmak daha iyi ama gerekli değil. Bir bellek sızıntısı beklemezdim, çünkü bileşen ne zaman imha edilirse, çöp toplanır ve bununla birlikte aboneliğiniz olur. Aboneliği aboneliğin dışına abone veya abonelikten geçirirseniz (örneğin, bir servis), bu bileşenin GCed olmasını engelleyebilir, fakat eğer bileşenlerin hepsi bileşen içinde ise zarar görmemelidir. –

cevap

4

, değişikliklerin de izlemeye devam o abonelikler durdurmak amacıyla çık yapmak gerekir.

Özel durumunuz için bir noktanız olduğunu düşünüyorum.

Aynı bileşende çok fazla aboneliğim olduğunda yapacağım şeylerden biri şudur:

Önce "subscriptions", boş bir Abonelik Türü Dizisi oluşturuyorum.

private subscriptions: Subscription[] = []; 

Sonra abone yapmanız gereken her zaman dizinin

this.subscriptions.push(this.form.valueChanges.subscribe(x => console.log(x))); 

itin Ve ngOnDestroy ben dizinin içindeki her abonelik aboneliğinizi.

+1

Aboneliklerinizi subscription.add() yöntemiyle ekleyebilirsiniz. Sonra sadece en üst aboneliği iptal etmeniz gerekir. – DarkNeuron

2

Bileşeniniz yok olduğunda, aboneleriniz onlara gelebilecek herhangi bir olay için beklemiyorsa, bellekte kalmayacak, bazen mantıklarınızı da bozabilir. Örneğin yönlendirici etkinlik aboneliği, uygulamanızın her yerinde tetiklenecek ve abonelik içinde yaptığınız kodu çalıştıracaktır.

İkinci durumda, bileşenler arasında geçiş yaparsanız ve hiç bir zaman aboneliğinizi iptal etmezseniz, uygulamanız yeni aboneleri yüklediğinizde, bir süre sonra uygulamanız kapanır. Babar söz vardı gibi

@Component({}) 
export class DummyComponent implements OnDestroy { 
form: FormGroup; 
subscription: Subscription; // from rxjs 
constructor(private fb: FormBuilder) { 
    this.form = this.fb.group({ 
     firstName: [''], 
     lastName: [''] 
    }); 
    this.subscription = this.form.valueChanges.subscribe(
     x => console.log(x) 
    ); 
} 

ngOnDestroy(): void { 
    this.subscription.unsubscribe(); 
} 
}