2017-01-13 12 views
0

現在、Ionic 2モバイルアプリケーションを開発中です。私はAngularFire2を使ってFirebaseから入手したアイテムのリストを持っています。リストに並べ替え機能を実装しました。アイテムのインデックスをリストに保存してFirebaseに送信して、インデックスを使用してユーザーの設定に基づいてアイテムの優先順位を付けることができるようにしたいと考えています。私はこれを行う方法がありますか?私はFirebaseに「インデックス」を送ろうとしましたが、それは仕事をしませんでした。イオン2:リストの各項目のインデックスを取得し、Firebaseに保存します

HTML:

 <ion-list reorder="true" (ionItemReorder)="reorderItems($event)"> 
     <ion-item *ngFor="let item of categories; let i = index;"> 
      {{i+1}}. {{item.name}} 
     </ion-item> 

     </ion-list> 
    </ion-content> 

活字体:

 export class ManageFavouritesPage { 
     fireAuth: any; 
     items: any; 
     categories: any; 
     categorykey: any; 

     constructor(public navCtrl: NavController, public af: AngularFire, private toastCtrl: ToastController, public authData: AuthData) { 

     let userid = this.authData.getID(); 
     this.items = af.database.list(`/users/${userid}/favourites`) 
      .subscribe(data => this.categories = data) 
     } 


     reorderItems(indexes) { 
     let element = this.categories[indexes.from]; 
     let element2 = this.categories[indexes.to].$key; 
     this.categories.splice(indexes.from, 1); 
     this.categories.splice(indexes.to, 0, element); 
     let userid = this.authData.getID(); 
     this.items = this.af.database.object(`users/${userid}/favourites/${element2}`).update({priority: indexes.to}); 

    } 
    } 

答えて

0

fromto間のすべての要素のインデックスが変更されています。あなたは、一度にそれらのすべてを更新するために、マルチロケーションupdateコールを使用することができます。

reorderItems(indexes) { 

    // Reorder the array: 

    this.categories.splice(indexes.from, 1); 
    this.categories.splice(indexes.to, 0, element); 

    // Build the multi-location update: 

    let min = Math.min(indexes.from, indexes.to); 
    let max = Math.max(indexes.from, indexes.to); 

    let reindexed = {}; 
    for (let i = min; i <= max; ++i) { 
    reindexed[`${this.categories[i].$key}/priority`] = i; 
    } 

    // Update the reordered elements: 

    let userid = this.authData.getID(); 
    this.af.database.object(`users/${userid}/favourites`).update(reindexed); 
} 

また、this.itemsあなたはsubscribeがRxJSサブスクリプションとupdateリターンの約束を返すよう、それは、と思われるもの最も可能性が高いではありません。

+0

助けてくれてありがとう! Firebaseの優先順位を更新しているようです。しかし、私は時間の半分しか動かないことを知りました。時々、アイテムを並べ替えると、最初の注文に戻ります。 –

+0

更新が完了する前に並べ替えを行うと、問題が発生する可能性があります。 'update'は約束を返します。それが解決するまで再注文するべきではありませんが、イオニックがそれを強制するかどうかは別の問題です。 – cartant

+0

よろしく!編集/完了ボタンを追加すると効果がありますか?完了ボタンをクリックすると更新されます。 –

関連する問題