Я новичок в angular и сейчас создаю небольшое веб-приложение.
Мне удалось настроить angularfire 2 и успешно создать новую запись в списке с помощью Push ().
Скажем, мой список (пользователей) состоит из адреса электронной почты и имени пользователя. только электронное письмо добавляется с помощью метода Push, и я хочу обновить эту запись, добавив имя.
Я сослался на документацию Angularfire2 и сумел зайти так далеко:
usrEmail: string;
usrData: AngularFireList<any>;
usr: Observable<any>;
constructor( private authService: AuthService, private afd: AngularFireDatabase) {
this.usrData = this.afd.list('/users')
// now get the current user
this.usr = this.usrData.snapshotChanges().map(changes => {
return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
});
}
Я не уверен, как мне отфильтровать список по usrEmail и получить ключ для обновления записи.
Любая помощь, указывающая мне в правильном направлении, очень ценится.





Используемый вами запрос получает все /users, а не только одного пользователя с совпадающим адресом электронной почты.
Я предполагал, что у вас есть доступ к адресу электронной почты, и он назначен переменной userEmailAddress.
this.usr = this.afd.list('/users', ref => ref
.orderByChild('usrEmail')
.equalTo(userEmailAddress)
)
.snapshotChanges()
.map(changes => {
return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
})
.first()
.subscribe(snapshots => {
snapshots.forEach(snapshot => {
console.info('Snapshot Key: ', snapshot.key);
console.info('Snapshot Payload: ', snapshot.val());
});
});
Вывод snapshot.key будет ключом, который вы пытаетесь получить.
Однако в вашем сценарии был бы лучший способ сохранить адрес электронной почты клиентов. Вы можете создать путь, содержащий идентификатор пользователя в базе данных, например;
Я предполагаю, что у вас есть доступ к uid через authService. this.authService.uid
this.afd.object(`/users/${this.authService.uid}`).update({
email: userEmailAddress
});
uid пользователя никогда не изменится, и он уникален для этого пользователя, поэтому вы можете создавать пути к базе данных с его помощью для легкого доступа.
Push используется для создания уникального пути. Если вы сделаете что-то вроде this.afd.list( / users / $ {this.authService.uid} ).push({ email: userEmailAddress });, он сгенерирует путь типа /users/someUid/someRandomPushKey/email, который представляет собой длинный путь с someRandomPushKey в середине пути, что затрудняет декодирование. Если вы используете set или update, он будет записывать по указанному вами пути без добавления дополнительных ключей. Путь будет /users/someUid/email, который намного короче.
Большое спасибо за оперативный ответ. Большое спасибо, предложенный вами метод намного лучше. одно быстрое пояснение, могу ли я использовать push () для создания нового пути? Через некоторое время проверим код и отметим как ответ :)