2017-04-18 20 views
1

In meiner Anwendung ausgelöst hat ich BehaviorSubject bin mit Daten von Anbietern zu Seite Komponente zu übergeben:BehaviorSubject: letzten Wert ignorieren, wenn next() nicht

JobsManager

private futureJobsSource = new BehaviorSubject <Array<Job>>([]); 
    futureJobsUpdate = this.futureJobsSource.asObservable(); 

Ort, an der Quelle aktualisiert:

getFutureJobs(date: string) { 
// 
// 
this.api.getFutureJobs(request).subscribe((res) => { 
     console.log(this.TAG + 'getFutureJobs: success: ' + JSON.stringify(res)); 
     this.futureJobsSource.next(res); 
    }, (err) => { 
     console.log(this.TAG + 'getFutureJobs: failure: ' + JSON.stringify(err)); 
     this.message.showErrorAlert(err.detail); 
    }); 
} 

Und meine Komponente, FutureJobsPage

setSearchDate() { 
    DatePicker.show(this.datePickerOptions).then((date) => { 
     this.jobsManager.getFutureJobs(moment(date).format('MM/DD/YYYY')); 
    }); 
    } 

ionViewDidLoad() { 
    console.log('ionViewDidLoad FutureJobsPage'); 
    this.subscription = this.jobsManager.futureJobsUpdate.subscribe((res) => { 
     console.log(this.TAG + 'subscribe: ' + JSON.stringify(res)); 
     this.futureJobs = res; 
    }); 
    } 

ionViewDidLeave() { 
    console.log(this.TAG + 'ionViewDidLeave'); 
    this.jobsManager.futureJobsUpdate.distinctUntilChanged(); 
    this.subscription.unsubscribe(); 
    this.futureJobs = []; 
} 

Als ich von meiner Suche über die richtige Art und Weise verstanden Daten vom Provider BehaviorSubject passieren ist eine optimale Lösung, aber ich möchte zuletzt empfangene Wert weglassen, wenn es nicht aus nächsten war(). Was ist die beste Vorgehensweise, um ein solches Verhalten zu erreichen?

+0

Sie meinen, ignorieren Sie den initialisierten leeren Wert? –

+0

@suraj Hallo, danke für die Antwort. Nein, in meinem Fall erhalte ich den letzten ausgesendeten Wert, und ich möchte diesen Wert ignorieren oder durch ein leeres Standard-Array ersetzen, bis der nächste ausgegeben wird. –

+1

Nicht wirklich klar, wie das funktionieren soll. * Ich möchte den letzten empfangenen Wert weglassen, wenn er nicht von next() * stammt, bedeutet wörtlich, dass Sie kein 'leeres Standard-Array' benötigen und einfach Subject anstelle von BehaviorSubject verwenden können. Wenn dem nicht so ist, scheint mir eine der Aussagen widersprüchlich zu sein. Ein einfaches Beispiel, das aus Angular Stuff mit erklärten Input und Output isoliert wurde, würde helfen. – estus

Antwort

1

Verwenden Sie Subject anstelle von BehaviorSubject, Abonnement startet erst nach dem ersten Emittieren.

BehaviorSubject

Eine der Varianten der Themen ist die BehaviorSubject, die eine Begriff des "aktuellen Wert" hat. Es speichert den letzten Wert, der an seine Benutzer ausgegeben wird, und jedes Mal, wenn ein neuer Observer subskribiert wird, erhält er sofort den "aktuellen Wert" vom BehaviorSubject.

Hoffe, das hilft !!

+0

danke, sieht aus wie ich wollte –

Verwandte Themen