Что хранить в ngrx / store при использовании angularfire2?
Я начинаю изучать angular2 и пошел ва-банк с ngrx/store (у меня нет предыдущего exp с redux) и firebase app. Теперь я не могу понять, как хранить объекты firebase, массивы и прочее в магазине. Должен ли я положить их так, как есть, например, положить этот FirebaseListObservable в магазин af.database.list('/items')? Это выглядит как хорошая подгонка (компонент мог бы просто сделать магазин.select ('items') и template могли бы подписаться на это, и для мутаций я все еще могу запускать события в магазин, где я бы мутировал список с помощью но я думаю, что это не потому, что этот список может быть изменен из-за пределов магазина (какой-то другой пользователь приложения, который подписывается на тот же список). Или это должно зависеть от конкретного случая?
Если нет, то где я должен хранить ссылку на этот объект firebase и что я должен поместить в хранилище вместо этого?
1 ответ:
Это рекомендуемые, которая должна быть положена в магазине только содержание сериализуемые:
Настоятельно рекомендуется помещать в хранилище только простые сериализуемые объекты, массивы и примитивы. Технически возможно вставить несериализуемые элементы в хранилище, но это может нарушить способность сохранять и регидрировать содержимое хранилища, а также помешать отладке перемещения во времени.Асинхронная природа angularfire2 observables означает, что вы, вероятно, захотите интегрировать их с помощью @ngrx/effects. Эффекты, по существу, прослушивают определенное действие, выполняют некоторый (возможно, асинхронный) побочный эффект и затем (обычно) производят другое действие.
Как вы это сделаете, будет зависеть от того, что именно вы хотите сделать.Например, если вы хотите использовать
FirebaseListObservableдля выполнения запросов, вы можете использовать типичныйREAD_ITEMS,READ_ITEMS_SUCCESSиREAD_ITEMS_ERRORдействия и эффект, как это:@Effect() readItems$ = this.actions$ .ofType('READ_ITEMS') .switchMap(() => this.af.database .list('/items') .first() .map(items => ({ type: 'READ_ITEMS_SUCCESS', payload: items })) .catch(() => Observable.of({ type: 'READ_ITEMS_ERROR', payload: error.toString() })) );Однако, если вы хотите слушать изменения в реальном времени из
FirebaseListObservable, Вы можете сделать что-то вроде этого:Обратите внимание, что второй эффект не прислушивается к действию. Вместо этого он реагирует на состояние аутентификации и будет выдавать действия@Effect() refreshItems$ = this.af.auth .switchMap((authState) => authState ? this.af.database .list('/items') .map(items => ({ type: 'REFRESH_ITEMS', payload: items })) : Observable.of({ type: 'REFRESH_ITEMS', payload: [] }) );REFRESH_ITEMSпосле аутентификации пользователя и т. д.В обоих случаях произведенное действие будет содержать полезную нагрузку массива элементов , которые могут быть обработаны редуктором для хранения в хранилище.
Comments