3

私は、TypescriptでAngular 2アプリを開発しています。データを同期するときにオブジェクト型を非常に簡単に永続させることができない場合、関数を失うことなく、Typescript型をFirebaseオブジェクトObservableに同期

私は手動でプロパティを設定しています。場合によっては、$ exists()、$ key、c​​reatedat関数、およびプロパティを削除して、データを更新することができます。

クラスを完全に変更せずにFirebaseオブジェクトから設定する方法はありますか?例えば

:フリップ側では

search$:FirebaseObjectObservable<ISearchQuery>; 
search:ISearchQuery; 

constructor(public af: AngularFire, public auth: AuthService){ 
    this.search$ = this.af.database.object(`/queries/saved/${auth.id}`); 
    //THIS IS HOW I WANT TO DO IT 
    this.search$.subscribe((data)=>{ 
    if(data.$exists()){ 
     this.search=data;   
    } 
    }); 

    //THIS IS WHAT I'VE RESORTED TO 
    this.search$.subscribe((data)=>{ 
    if(data.$exists()){ 
     this.search.categories = data.categories; 
     this.search.creators = data.creators; 
     this.search.endDate = data.endDate; 
     this.search.startDate = data.startDate; 
     this.search.location = data.location; 
    } 
    }); 
} 

私は、データを同期して更新した後、私は、更新またはfirebaseに設定する場合は、各プロパティを選択する必要があります。また、私が直接同期すると問題にぶつかります。クラスファンクションも失われます(ファイヤーベースオブジェクトには、プロトタイプに独自の関数セットがあるため)。

プロパティでピッキングプロパティを避ける方法や、TypescriptでFirebaseオブジェクトを同期させるより良い方法はありますか?

答えて

2

AngularFire2にFirebaseのスナップショットを保存させたいと思うようです。既定では、'unwraps' the snapshotsには、不要なプロパティと機能が追加された$が追加されています。

あなたがpreserveSnapshotオプションを指定した場合、それはこれをしないと、あなたはsnapshot.val()呼び出すことができます。

constructor(public af: AngularFire, public auth: AuthService) { 

    this.search$ = this.af.database.object(`/queries/saved/${auth.id}`, { 
    preserveSnapshot: true 
    }); 
    this.search$.subscribe((snapshot) => { 
    if(snapshot.exists()) { 
     this.search = snapshot.val(); 
    } 
    }); 
} 

をそして、あなたは後でそれを必要としている場合、あなたは常にスナップショットを維持することができます。

について - snapshot.val()から受け取った値は匿名のオブジェクトです。これは私が想定しているインターフェイスです。データの「形状」を記述するインタフェースにキャストすることは安全ですが、そのインタフェースにメソッドが含まれている場合、メソッドは匿名オブジェクトに存在しないため動作しません。そのインターフェイスを実装するクラスがある場合は、snapshot.val()から受け取った匿名オブジェクトを受け入れるコンストラクタを含める必要があります。例えば

:素晴らしいです、そしてそれは限り答えの半分をだように見える

this.search$.subscribe((snapshot) => { 
    if(snapshot.exists()) { 
    // Given SomeSearchQuery implements ISearchQuery 
    this.search = new SomeSearchQuery(snapshot.val()); 
    } 
}); 
+0

などが...しかし、それは私のように見えるの機能を取り除くことなく、データを再同期私が保存したいクラスをこのようにインスタンス化しても、私のISearchQuery型の関数は失われます。それを行う方法はありますか? –

+0

答えを更新しました。 – cartant

+0

それは私に頭痛の多くを節約します。 $ exists、$ keyなどを削除せずに直接オブジェクトを同期することができました。コンストラクタを使用して匿名オブジェクトを渡すことは意味があります。感謝万円! –

関連する問題