AngularFire2 Firebase.update не удалось выполнить моментальный снимок.существует()

Я создаю приложение Angular2, хочу обновить профили пользователей в Firebase, использую AngularFire2. Например, когда я пытаюсь обновить профиль пользователя, у которого есть ключ «nmH5ZmawpQgogoCRVFVfNaBN6xg1», когда я нажимаю кнопку, чтобы обновить его, появляется ошибка EXCEPTION: Error in ./ProfilComponent class ProfilComponent - inline template:82:10 caused by: Firebase.update failed: First argument contains a function in property 'users.nmH5ZmawpQgogoCRVFVfNaBN6xg1.$exists' with contents: function () { return snapshot.exists(); }

user.service.ts

  users:FirebaseListObservable<any>;

  updateUser(user:IUser){
   this.users=this.af.database.list('/users');
   this.users.update(user.uid,user);
  }

user.ts

export interface IUser { 
avatarUrl:string;
 createdDate:string; 
birthDate:string;
 displayName:string; 
email:string; 
gendre:string; 
interests:Interest[];
 job:Job[]; 
location:ILocation; 
plateform:string; 
uid:string;
}

Заранее спасибо.


person naruto    schedule 08.03.2017    source источник
comment
решение состоит в том, чтобы удалить свойство $key и функцию $exists из пользовательского объекта: удалить this.user['$key']; удалить this.user['$exists'];   -  person naruto    schedule 23.03.2017


Ответы (2)


В AngularFire2 элементы списка и объекты имеют свойство $key и добавленную функцию $exists. См. unwrapMapFn функция полезности.

Начиная с версии 2.0.0-beta.8 , свойства $key и $exists не должны быть перечисляемыми и должны игнорироваться реализацией update.

Если вы не хотите обновлять свою зависимость AngularFire2 до последней бета-версии, вы можете использовать следующий обходной путь:

updateUser(user: IUser) {
  const { $exists, $key, ...userWithout$ } = user as any;
  this.users = this.af.database.list('/users');
  this.users.update(user.uid, userWithout$);
}

Однако в последних выпусках было исправлено несколько ошибок, поэтому обновление рекомендуется.

person cartant    schedule 08.03.2017
comment
это мой интерфейс IUser, экспортный интерфейс IUser { avatarUrl:string; Дата создания: строка; Дата рождения: строка; отображаемое имя: строка; электронная почта: строка; жанр: струнный; интересы:Интерес[]; Работа:Работа[]; местоположение: IМестоположение; форма пластины:струна; идентификатор: строка;} - person naruto; 08.03.2017
comment
Это не меняет ответ. Элемент списка или объект, который вы получаете от AngularFire2 (и, без сомнения, приводите к интерфейсу), уже имеет свойства с префиксом $. Ваш интерфейс — это просто статическая типизация; свойства по-прежнему будут частью экземпляра. - person cartant; 08.03.2017
comment
Спасибо за ваш ответ на мой вопрос, но мой интерфейс IUser не имеет свойств $key,$exists,userWithout$, я добавил эти свойства в свой интерфейс, но это ничего не меняет - person naruto; 08.03.2017
comment
Я вижу, что вы говорите: интерфейс сейчас. Обходной путь можно использовать без добавления $key и $exists в ваш интерфейс, если используется as any. Однако вам действительно следует обновиться до последней версии AngularFire2. И вам определенно не нужен userWithout$ в вашем интерфейсе — это просто переменная, которая собирает свойства, отличные от $key и $exists. - person cartant; 08.03.2017

Вкратце: объект, который вы указываете вторым аргументом обновления, может не содержать свойства $key и $exists:

const key = user.uid;
let userWithout$ = user;
delete userWithout$.$key;
delete userWithout$.$exists;

this.users.update(key, userWithout$);

Кстати: лишний вопрос:

строка деструктурирования @cartant использует:

const { $exists, $key, ...userWithout$ } = user as any;

это очень хорошо, но не сработало в моем случае и привело к следующей ошибке: Ожидается шаблон деструктурирования свойства.

Это синтаксис ES6, и он должен работать. Я использую машинопись 2.4.1. Возможно, что-то не так с моим tsconfig.json? (Цель компиляции ts для моего проекта должна быть es5).

person Doek    schedule 18.07.2017