3

我已閱讀關於此的所有問題,但我仍未找到答案。所以不要將其標記爲重複。是否可以撤銷Firebase列表?

我正在使用AngularFire和Angular 2和Typescript。我正在使用FirebaseListObservable從端點中提取最近24條記錄的列表。這裏是我的代碼:

import { Component } from '@angular/core'; 
import { AngularFire, FirebaseListObservable } from 'angularfire2'; 

@Component({ 
    selector: 'story-list', 
    templateUrl: './story-list.component.html', 
    styleUrls: ['./story-list.component.scss'] 
}) 
export class StoryListComponent { 
    stories: FirebaseListObservable<any[]>; 

    constructor(af: AngularFire) { 
    this.stories = af.database.list('/stories', { 
     query: { 
     limitToLast: 24 
     } 
    }); 
    } 
} 

這將返回24個最新的故事,如預期的列表,但是當我使它們在頁面上:

<p *ngFor="let story of stories | async">{{ story.title }}</p> 

它顯示在頂部的最古老的故事,和最新的底部。我明白這是爲什麼,而且我並沒有聲稱這是一個問題,但我將如何扭轉這種情況?我希望能夠在查詢中反轉這一點,但如果這是不可能的,我會在渲染中以某種方式反轉它。

無論您的答案是什麼,請不要鏈接到文檔。沒有充分解釋這一點的AngularFire的文檔。我讀過每一個字。請提供真實的工作代碼。

然而,我絕對不會接受的一個解決方案是,在創建時在記錄中存儲否定日期,然後根據該日期進行排序。這是我聽過的最糟糕的解決方案,真正的數據庫系統將允許您在查詢中執行此操作。所以請不要建議。

如果您有任何想法,我將不勝感激。我不願意使用其他產品,因爲我喜歡Firebase。

回答

13

據我所知,Firebase查詢總是按升序排列。

但是,您可以使用map運營商扭轉年代由AngularFire2觀察到發出的數組反向呈現的列表的順序:

import "rxjs/add/operator/map"; 

... 

this.stories = af.database.list('/stories', { 
    query: { 
    limitToLast: 24 
    } 
}).map((array) => array.reverse()) as FirebaseListObservable<any[]>; 

如果你喜歡做的模板,你可以看看this answer

+0

我喜歡第一種方法,但會導致錯誤「Property'map'在類型'FirebaseListObservable ''上不存在。 –

+0

我認爲問題在於FirebaseListObservable不是數組,因此您無法對其執行類似數組的操作。 –

+0

它會工作;發出的值是一個數組。這只是一個TypeScript/RxJS問題。很可能您需要導入'map'運算符來安撫TypeScript。我已經更新了答案。 – cartant