У меня есть приложение Angular, и я создал класс для своего списка контактов, который состоит из:
export interface Contact {
id: number;
name: string;
address: string;
}
export class ContactList {
private contactList: Contact[];
private contactNumber: number;
public getContactList(): Contact[] {
return this.contactList;
}
// Methods to add, modify and remove a contact
}
Затем у меня есть служба, которая создает экземпляр этого класса, создает BehaviorSubject для совместного использования с другими компонентами и имеет несколько общедоступных методов.
export class ContactListService {
public contactList: ContactList;
private contactList$: BehaviorSubject<Contact[]>;
constructor() {
this.contactList = new ContactList(FAKE_CONTACTS);
this.contactList$ = new BehaviorSubject<Contact[]>(this.contactList.getContactList());
}
public getContactList(): BehaviorSubject<Contact[]> {
return this.contactList$;
}
public deleteContact(contactId: number): void {
this.contactList.deleteContact(contactId);
}
public addContact(newName: string, newAddress: string): void {
this.contactList.addContact(newName, newAddress);
}
public modifyContact(contactId: number, newName?: string, newAddress?: string): void {
this.contactList.modifyContact(contactId, newName, newAddress);
}
}
Затем в компоненте я подписываюсь на BehaviorSubject и влияю на значение свойства моего компонента.
ngOnInit() {
this.contactListSubscription = this.contactListService.getContactList().subscribe((newContactList) => {
this.contactList = newContactList;
});
}
Так что он работает (т.е. все обновляется везде, когда я выполняю действие через службу). Но я не понимаю, что содержимое подписки (т.е. this.contactList = newContactList
) выполняется только один раз в подписке, а не каждый раз, когда происходит действие. Даже если я изменю содержимое с помощью метода contactListService. И даже если я откажусь от подписки, например, через 2 секунды после подписки (например, с помощью setTimeout), контент всегда будет актуальным после отказа от подписки ...
Сначала я даже не понимал, почему он работает в сервисах, не делая contactList$.next(this.contactList.getContactList())
после каждого действия, изменяющего объект.
Кажется, я передал какие-то ссылки вместо содержимого класса? Кажется, я не понимаю, как работает BehaviorSubject!