Мне трудно понять, чего вы на самом деле пытаетесь достичь, но ..
Во-первых, никогда не используйте эту конструкцию, потому что она создает бесконечный цикл:
this.dataService.getEventSubject().subscribe((param: any) => {
this.reloadTickets();
});
Когда значение изменяется, у вас есть доступ к новым значениям в компоненте.Вам следует обновлять наблюдаемое только после того, как вы манипулируете данными, например:
// Reads the observable
this.dataService.getEventSubject().subscribe((param: any) => {
this.populateForm();
});
// Updates the observable
this.addTicket() {
this.dataService.addTicket()
}
Далее, вы всегда должны вводить ваши переменные, например:
export interface Ticket {
artist: string;
price: number;
}
export interface File {
name: string;
type: 'gif' | 'jpg' | 'png';
}
Как только вы добавляете типы в Observable, вы замечаете, что вам на самом деле нужно два субъекта.
// As a convention, It's recommended to use singular form, and add a $.
public ticket$ = new BehaviorSubject<Ticket[]>(null);
public file$ = new BehaviorSubject<File[]>(null);
Кроме того, я должен сделать их общедоступными, чтобы иметь легкий доступ без необходимостиget()
.Вы можете просто получить к нему доступ, введя службу и вызвав наблюдаемое.
constructor(
private dataService: DataService
)
this.dataService.ticket$
Когда вам нужно , чтобы сделать их приватными, вы должны использовать:
private _ticket$: Subject<Ticket[]> = new BehaviorSubject<Ticket[]>(null);
public ticket$ = this._ticket$.asObservable();
С этой конструкцией вы можете читать наблюдаемые в каждой службе / компоненте , но только обновлять их в содержащей службе .
Еще одна вещь, которую вы всегда должны делать, это завершить наблюдаемые в вашем компоненте, в противном случае вы сохраняете открытую подписку навсегда:
private destroy$ = new Subject<any>();
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
this.dataService.ticket$.pipe(takeUntil(this.destroy$)).subscribe(tickets => {
// Do something
})
Итог: если вы будете следовать правильным шаблонам, вы получите многоменьше вопросов / ошибок.