2017-07-07 53 views
0

我有2名火力地堡名單:其中包含4個項目包含2項 如何2個FirebaseListObservables合併成一個可觀察

  • privateItems

    • publicItems

    我想從兩個拉這些列表並將它們組合成一個可觀察的。

    要做到這一點,我試圖用合併

    import { Observable } from 'rxjs/Rx'; 
    import 'rxjs/add/operator/merge'; 
    
    items: Observable<any[]>; 
    this.items = this.af.list('/privateItems').merge(this.af.list('/publicItems')); 
    

    然後在視圖:

    <ul> 
        <li *ngFor="let item of items | async">item.title</li> 
    </ul> 
    

    然而,這僅顯示4個公共的效果項目。

    合併這個正確的工具?我將如何將2個FirebaseListObservables合併爲1個可一起顯示的Observable?

  • +1

    這是正確的。你可以嘗試'Observable.merge(___,____)'。也可以嘗試'this.af.list( '/ privateItems')。這樣做(的console.log).merge(this.af.list( '/ publicItems'))。這樣做(的console.log)' – Skeptor

    +0

    使用Observable.merge( __,__)具有相同的效果。似乎無論可觀察到的是第二個「覆蓋」另一個。例如,如果我使用publicItems將調用交換到privateItems,那麼它只顯示2個私人項目。 @Skeptor – mkimmet

    +0

    您是否嘗試過第二種說法 – Skeptor

    回答

    2

    試試這個

    this.items = Observable.combineLatest(
        this.af.list('/privateItems'), 
        this.af.‌​list('/publicItems'), 
        (privateItems, publicItems)=> { 
         console.log(privateItems); 
         console.log(publicItems); 
         return [...privateItems, ...publicItems] 
        } 
    ); 
    

    OR

    this.items = this.af.list('/privateItems') 
        .flatMap(privateItems=> this.af.list('/publicitems') 
         .map(publicItems=> [...privateItems, ...publicItems]) 
        ); 
    

    更新

    我得到了什麼,你的情況發生。你得到的兩種反應流:

    -----[privateItems] -------- [publicItems]----- 
    

    所以this.items獲得的第一個響應值,然後它會覆蓋與第二響應值。但是對於您的要求,您需要將它們放在一起,因此使用reduce可能會有所幫助。

    this.items = this.af.list('/privateItems') 
         .merge(this.af.list('/publicItems')) 
         .reduce((total,current)=>[...total,...current],[]); 
    
    +0

    真棒,做到了!從理論上講,合併的工作是否類似? – mkimmet

    +0

    應該,讓我同樣的使用合併 – Skeptor

    +0

    我的推理更新它爲什麼沒有爲你 – Skeptor

    1

    對不起,復活舊的文章,但這裏是我的合併可變數目FirebaseListObservables的解決方案:

    let rooms = ['room1', 'room2', 'room3']; 
    let observables = rooms.map((room) => { return this.cs.getMessagesByRoomId(room) }); 
    
    this.messages = Observable.combineLatest(
        observables, 
        (...rooms) => { 
        console.log('rooms',Array.prototype.concat(...rooms)); 
        return Array.prototype.concat(...rooms) 
        } 
    ); 
    
    相關問題