2017-01-15 5 views
0

Как отсортировать следующую структуру в Firebase по sortOrder?Firebase orderByChild Игнорируется

categories { 
    { 
     "b": { 
      "name": "Banana", 
      "sortOrder": 2 
     }, 
     "a": { 
      "name": "Apple", 
      "sortOrder": 1 
     } 
    } 
} 

Из документации это выглядит так просто, как:

ref('categories').orderByChild('sortOrder').once('value') ... 

Однако первый узел Возвращается банан. Неважно, какое значение строки я использую. Например, следующий возвращает те же результаты:

ref('categories').orderByChild('xxx').once('value') ... 

Полная функция:

public list(): Observable<Category[]> { 

    let ref = firebase.database().ref('categories').orderByChild('sortOrder'); 

    return Observable.fromPromise(<Promise<any>>ref.once('value')) 
     .flatMap(snapshot => { 
      let objects = snapshot.val(); 
      let categories: Array<Category> = new Array(); 

      for (let key in objects) { 
       let category: Category = objects[key]; 
       category.code = key; 
       categories.push(category); 
      } 

      return Observable.of(categories); 
     } 
    ); 
} 
+0

Как вы обращаетесь к детям в обратном вызове? – cartant

+0

Добавлен ко всем функциональным кодам. –

ответ

0

Проблема заключается в том, что при обращении к детям с помощью клавиш Value моментального снимка, в порядок неопределен.

Вы должны использовать forEach метод моментальных снимков, в:

return Observable.fromPromise(<Promise<any>>ref.once('value')) 
    .flatMap(snapshot => { 
     let categories: Array<Category> = new Array(); 
     snapshot.forEach(childSnapshot => { 
      let category: Category = childSnapshot.val(); 
      category.code = childSnapshot.key; 
      categories.push(category); 
     }); 
     return Observable.of(categories); 
    } 
); 

Кроме того, вы могли бы просто использовать map и вернуть categories.

Смежные вопросы