Я использую AngularFire2 для чтения данных из Google Cloud Firestore. Документы показывают, как получать обновленный набор документов при каждом изменении данных с помощью valueChanges()
:
this.items = db.collection<People>('people').valueChanges()
У меня также есть класс People
, который определяет некоторые атрибуты (имя и фамилию) и функцию / метод fullName
,
export class People {
public first: String = '';
public last: String = '';
constructor(...args) {
[ this.first, this.last, this.active ] = args;
}
static MakePersonFrom(input: Any) {
return Object.assign(new People(), input);
}
fullName() {
return `Honorable ${this.first} ${this.last}`;
}
}
Класс People
соответствует моим документам в коллекции people
, у каждого из которых есть имя и фамилия. Я хочу вызвать fullName
для элементов this.items
, например, в шаблоне html:
<ul><li *ngFor = "person in people | async">{{person.fullName()}}</li></ul>
Чтобы это работало, я подписался на valueChanges и преобразовал каждый входящий документ:
this.items = db.collection<People>('people').valueChanges()
.pipe(
map(listOfPeople => {
return listOfPeople.map(person => {
return People.makePersonFrom(person);
});
}),
tap(item => {console.info('Converted', item); } ),
);
Мне интересно, есть ли более простой способ сделать это в AngularFire2. Приведенный выше код .pipe
в основном является шаблоном, но для имени класса. Есть ли вариант valueChanges()
, который может сделать это за меня?
Я обнаружил, что поведение AngularFire2 соответствует Сам угловой, как показано в этом небольшом отрывке из главы HTTP руководства:
config: Config;
showConfig() {
this.configService.getConfig()
// clone the data object, using its known Config shape
.subscribe((data: Config) => this.config = { ...data });
Они используют оператор распространения вместо Object.assign
и имеют дело только с одним ответом, но в остальном это то же самое.