1

我似乎被困在這裏,因爲沒有很多關於如何使用firestore和ngrx的指南或教程。假設我們有組織清單,所有這些將被用於2個組分,組分和組分B中。用ngrx找出firestore

  1. 我可以做一個效果,它需要一個LOAD_ACTION來合併集合valuechanges observable,並且還將它映射到每個組件的LOAD_ACTION_SUCCESS。

現在每當有變化,LOAD_ACTION_SUCCESS都會被調用,將我們的數據保存到它們的每個存儲狀態。

但是這需要組件調度LOAD_ACTION以開始,這對於REAL_TIME_DATA可能看起來有點錯誤,因爲它將在之後繼續更新。即使不使用。

  1. 我可以在組件本身中連接valuechanges的服務可觀察值(與LOAD_ACTION相同)。它不會保存狀態,但Firebase可觀察點就像一個Store(只要它不保存在客戶端),所以如果它已經獲得了數據,它就已經存在了。

不再使用狀態數據的2個副本。

這使我:

  • 如果它也許有來自服務,這兩個組件從,獲取數據「收集」商店如沒有多在任何地方使用該狀態的副本。
  • 任何信息或指導,以幫助我得到進一步讚賞,我似乎被困在這樣一個小問題,顯然我可以保持編碼,而是希望它是正確的。

    由於涉及到ngrx,處理實時數據似乎讓我感到困惑。

    示例也將被讚賞。

    回答

    1

    我剛剛寫了一個關於這個問題的小小blog,我想比較一下連接Firestore和NGRX的不同方法。

    基本上,您可以將valueChanges()操作映射到您的商店操作,並且商店將同步。我使用了一種效果,但也可以在服務中使用。

    @Effect() 
        getData$ = this.dataDb.getFakeDataStateChanges().pipe(
        mergeMap(actions => actions), 
        map(action => { 
         return { 
         type: `[FirstData] ${action.type}`, 
         payload: { id: action.payload.doc.id, ...action.payload.doc.data() } 
         }; 
        }) 
    ); 
    

    當動作都像

    export enum FirstActionTypes { 
        FIRST_DATA_ADDED = '[FirstData] added', 
        FIRST_DATA_MODIFIED = '[FirstData] modified', 
        FIRST_DATA_REMOVED = '[FirstData] removed' 
    } 
    

    和減速器處理數據

    export function firstReducer(state: State = initialState, action: FirstAction) { 
        switch (action.type) { 
        case FirstActionTypes.FIRST_DATA_ADDED: 
         return firstAdapter.addOne(action.payload, state); 
    
        case FirstActionTypes.FIRST_DATA_MODIFIED: 
         return firstAdapter.updateOne(
         { 
         id: action.payload.id, 
         changes: action.payload 
         }, 
         state 
        ); 
    
        case FirstActionTypes.FIRST_DATA_REMOVED: 
         return firstAdapter.removeOne(action.payload.id, state); 
    
        default: { 
         return state; 
        } 
        } 
    }