2017-01-15 15 views
0

私はCity(複数のブロックを持つ)、Block(複数のAreaを持つ)、Area(1対多の関係は他のモデルに続き、ここには表示されません)の3つのモデルを持っています。angularfire2でリンクされた参照を削除する方法は?

画像からは、データを平坦化して$keyの参照を使用しています。

私の質問は、このデータを保存する最良の方法とリンクされたすべての参照を削除する方法です。ある都市が削除されたとき、ブロックの参照とブロックにリンクされたすべての領域を削除する必要があります。以下は

データ構造は、私は今、削除するために使用していたコードは、点で最大エリアの削除ではありません

enter image description here

です:

deleteCity(city: City): void { 
     this.af.database.list(`/cities/${city.$key}/blocks`, { preserveSnapshot: true }) 
       .subscribe(snapshots => { 
        snapshots.forEach(snapshot => { 
          this.af.database.object(`/blocks/${snapshot.key}`).remove(); 
         }); 
       }); 
     this.af.database.list('/cities').remove(city.$key).then(
      () => this.appstore.dispatch({ type: DELETE_CITY, payload: city}) 
    ); 
    } 

データ設計とも削除について提案して下さいプロセス。

答えて

1

あなたはおそらく最初にすべきことは、ブロックが削除されるまで、街を削除する前に待機している:

import 'rxjs/add/operator/first'; 
import 'rxjs/add/operator/toPromise'; 

// Use the first operator to take the first emitted list and then 
// complete the observable and use the toPromise operator to 
// convert it into a promise for simpler chaining. 

deleteCity(city: City): void { 
    this.af.database 
    .list(`/cities/${city.$key}/blocks`, { preserveSnapshot: true }) 
    .first() 
    .toPromise() 
    .then(snapshots => { 
     snapshots.forEach(snapshot => { 
     this.af.database.object(`/blocks/${snapshot.key}`).remove(); 
     }); 
    }) 
    .then(() => this.af.database.list('/cities').remove(city.$key)) 
    .then(() => this.appstore.dispatch({ type: DELETE_CITY, payload: city}); 
); 

あなたも、エリアについて同様の何かをする必要があります。

これ以外にも、データへのアクセス方法に応じてデータが変更されます。

あなただけのブロックの文脈における都市や地域の文脈でブロックにアクセスする必要がある場合や決して任意のブロックまたは領域にアクセスする必要がある、あなたはそのパスにおける都市のキーを含めることができます

/areas/$cityKey/$areaKey 
/blocks/$cityKey/$blockKey 

都市などのすべてのブロックとエリアを削除するのは簡単です。

もう1つの方法は、ブロック内にあるcityKey子プロパティを使用することです。あなたは、このようなクエリを有するものをつかむことができます。

this.af.database 
    .list(`/blocks`, { 
    preserveSnapshot: true, 
    query: { 
     orderByChild: 'cityKey', 
     equalTo: '-KaXa...' 
    } 
    }) 

を同様に、あなたは地域にcityId子を追加した場合、あなたは同様に、これらを問い合わせることができます。それは少なくとも、各ブロックのすべてのブロックと各ブロックのすべてのブロックを取得する必要はありません。都市キーを使用してブロックとエリアのすべてを取得するだけです。

関連する問題