2017-03-08 76 views
1

我一直在創建一個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(); }AngularFire2 Firebase.update failed snapshot.exists()

user.service.ts

users:FirebaseListObservable<any>; 

    updateUser(user:IUser){ 
    this.users=this.af.database.list('/users'); 
    this.users.update(user.uid,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; 
} 

在此先感謝。

+0

解決方法是從用戶對象中刪除$ key屬性和$ exists函數:delete this.user ['$ key'];刪除this.user ['$ exists']; – naruto

回答

1

在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$); 
} 

在最近發佈然而,也出現了一些bug修復,所以更新是鼓勵。

+0

這是我的界面IUser,導出界面IUser avatarUrl:string; createdDate:string; birthDate:string; displayName:string; email:string; gendre:string; 興趣愛好[]; 工作:Job []; 位置:ILocation; plateform:string; uid:string;} – naruto

+0

這不會改變答案。您從AngularFire2收到的列表項或對象(毫無疑問,轉換爲接口)已經具有$ -prefixed屬性。你的界面只是一些靜態類型;屬性將仍然是實例的一部分。 – cartant

+0

謝謝你對我的問題的回答,但我的界面IUser沒有屬性$ key,$ exists,userWithout $,我已經將這些屬性添加到我的界面,但它沒有改變 – naruto

0

簡而言之:你把更新的第二個參數的對象,可能不包含房產$鍵和$存在:

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的語法,應該工作。 我正在使用typescript 2.4.1。 也許我的tsconfig.json有問題? (我的項目的ts編譯目標必須是es5)。