2016-12-07 10 views
0

私はAngularFire2をIonic 2のプロバイダとして使用しています。私は基本的なリストアプリを作っています。以下はFirebaseにある私のデータです。Ionic 2&Angularfire2 + Firebase

{ 
    "Checklists" : { 
    "0" : { 
     "title" : "new List" 
    }, 
    "-KYHODAYcQ4OKMAzcXSG" : { 
     "items" : [ { 
     "checked" : "false", 
     "title" : "Milk" 
     } ], 
     "title" : "Newest List" 
    }, 
    "-KYHS654NUHiwkexMwhL" : { 
     "items" : [ { 
     "checked" : "false", 
     "title" : "asdfadf" 
     } ], 
     "title" : "ddddd" 
    } 
    } 
} 

私はこれをすべて自分の家で見ることができ、問題のないチェックリストのタイトルを更新しています。データプロバイダークラスでこのコードを使用してデータを取得してから、home.tsで呼び出します。これは途中でうまく動作します。

this.checklists = angFire.database.list('/Checklists'); 

私のアプリで新しいビューに移動すると問題が発生します。したがって、このコードを使用してチェックリストアイテムビューに移動し、現在のチェックリストを渡します。チェックリストは、それらを持っている場合

this.checklist = this.navParams.get('checklist'); 

はだから今、チェックリスト、アイテムビューで、私はタイトルとアイテムと一緒に現在のチェックリストへの参照を持っています。私がFirebaseにすでにいれば、これはうまく動作します。

Firebaseに存在しないチェックリストのいずれかにアイテムまたはアイテム配列を追加する方法が問題です。私は

if(this.checklist.items && this.checklist.items.length > 0){ 
    this.checklist.items.push({title: data.name, checked:"false"}); 
}else{ 
    this.checklist.items = [{title: data.name, checked:"false"}]; 
    console.log(this.checklist); 
} 

私は私が問題に遭遇しFirebaseにそれを更新したいときには、これを行うことにより、問題なく今のビューでそれを行うことができます。私はそれを私のデータプロバイダでこれを行うことによって項目の最初の配列で1つのチェックリストを更新することができます。

this.checklists.update(id, {items: [ 
     { 
      title: itemTitle, 
      checked: "false" 
     } 
    ]}); 

しかし、これは既に存在するものを上書きします。

現在のチェックリストへの参照を取得し、アイテム配列があるかどうかを確認する必要がありますが、これに関するドキュメントが見つかりません。私はrefを試しましたが、うまくいかないでしょう。どんな助けも素晴らしいだろう。ありがとう。

答えて

0

私はうまく動作するようになりましたが、これを行う正しい方法であるかどうかはわかりません。チェックリスト - 項目は次に、この

**this is the checklist-items view** 
if(this.checklist.items && this.checklist.items.length > 0){ 
    this.checklist.items.push({title: data.name, checked:"false"}); 
}else{ 
    this.checklist.items = [{title: data.name, checked:"false"}]; 
    console.log(this.checklist); 
} 

を行うことで、私は現在checklist.items配列にアイテムを追加するビューでは、私は私のデータプロバイダクラスに追加する機能や項目を呼び出し、それを持っている全体のチェックリストを送信しますアイテム全体の配列。

this.data.addItem(this.checklist); 

はその後、私のデータプロバイダでは、私は単に私のデータプロバイダクラスでこれを行うことにより、現在のチェックリストの全体items配列を上書きします。

**this is the data-provider view** 
addItem(checklist):void { 
    let checklistId = checklist.$key; 

    this.checklists.update(checklistId, {items: checklist.items}); 
} 

これは機能しますが、これは正しい方法であるかどうかわかりません。

0

データを格納する際に配列を使用しないことをお勧めします。配列は、キー名として整数を持つオブジェクトとして格納されます。これらの整数は永続的なキーではないため信頼できません。配列内の項目が削除されると、配列全体がサブミットされ、アイテムには新しい整数キーが割り当てられます。

は、データ構造を提案した:

checklist 
    -key 
     items 
      -itemKey 
       name: "milk" 
       checked: true 
      -itemKey 
       name: "bread" 
       checked: false  
      -itemKey 
       name: "sugar" 
       checked: true   
     title: "newest list" 
関連する問題