2017-01-13 1 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> 

타이프 : fromto 사이의 모든 요소들의

 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

인덱스들 변경 한 것이다. 당신은 한 번에 모두 업데이트 할 다중 위치를 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

좋아! 편집/완료 버튼을 추가해도 작동합니까? 완료 버튼을 클릭 한 후에 만 ​​업데이트됩니다. –

관련 문제