Проблема
У меня есть сервис, который выглядит так:
DogService {
public getSelectedDog(): Observable<Uuid> {...}
public getDog(dogUuid: Uuid): Observable<Dog> {...}
}
Я хотел бы создать Observable, который всегда содержит выбранную мной собаку, т.е. Observable<Dog>
.
Что я пробовал до сих пор
В настоящее время я делаю следующее:
let selectedDog: Observable<Dog> = dogService.getSelectedDog().flatMap( selectedDog => {
return dogService.getDog( selectedDog );
});
Затем вы можете подписаться на изменения в выбранной собаке следующим образом:
selectedDog.subscribe( dog => console.log( 'dog: ", dog.name, dog.mood );
К сожалению, похоже, это не работает так, как я ожидал. Наблюдаемый объект selectedDog срабатывает только тогда, когда selectedDog изменился, а не когда изменилась сама собака.
Итак, например, скажем, что мы делаем следующее:
const dog1: Dog = new Dog( '1', // uuid
'Shadow', // name
'happy' // mood
);
const dog2: Dog = new Dog( '2', // uuid
'Barky', // name
'Angry' // mood
);
// Fires the getDog observable
dogService.addDog( dog1 );
// Fires the getDog observable
dogService.addDog( dog2 );
// Fires the getSelectedDogObservable
dogService.selectDog( dog1.uuid )
// --- Now in console.log we will see: 'dog: Shadow happy'
К сожалению, если я обновлю собаку, консоль не войдет в:
const updatedDog1: Dog = new Dog( '1', // uuid
'Shadow', // name
'SAD' // mood
);
// Fires the getDog observable
dogService.updateDog( updatedDog1 );
// --- the console.log doesn't get invoked. Crap.
Вопрос: как создать Observable<Dog>
, который будет срабатывать при изменении выбора или выбранной собаки?