- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 ngrx 和 firestore 实现一个好友系统。
因此我创建了一个集合/users
来保存用户信息,比如姓名、头像图片链接、在线状态等。第二部分由每个用户的/users/{id}/buddies
集合组成,其中包含仅由 friend 组成的 friend 信息
pending
requested
或 buddy
。此设置允许为每个用户好友创建一个最小集合,并且不需要在 buddies
表中跟踪用户信息的副本。
设置和上下文就到此为止。
我在解决单个 friend 的用户文档引用时遇到了很多问题...理想情况下,我想要一个好友商店,其中包含当前用户的所有好友,并且可以使用各种选择器进行选择。
Buddy 模型应该类似于:
export interface Buddy {
uid: string;
buddyStatus: BuddyStatus;
userRef: User | any;
}
User
模型看起来像这样:
export enum AuthState {
LOGGED_IN = "LOGGED_IN",
NOT_LOGGED_IN = "NOT_LOGGED_IN"
};
export interface User {
uid: string | null;
displayName: string | null;
authState: AuthState;
loading?: boolean;
error?: string | null;
avatarUrl: string | null;
};
buddies store通过监听状态变化并调度相应的ngrx store actions(添加、修改、删除)同步到firestore数据库:
query$ = createEffect(() => this.actions$.pipe(
ofType(BuddiesActions.query),
switchMap(() => {
return this.uid$.pipe(
switchMap(uid => {
return this.afs.collection(`users/${uid}/buddies`).stateChanges();
})
)
}),
mergeMap(actions => {
return actions;
}),
// map the firestore actions to ngrx store actions to sync them
// TODO this adds the user reference and things fuck up here...
map((action: DocumentChangeAction<any>) => {
const data = action.payload.doc.data();
console.log({data: data});
return {
type: `[Buddies] ${action.type}`,
buddy: {
buddyStatus: data.buddyStatus,
uid: data.uid,
// this is the issue right here
// userRef: data.userRef
}
};
})
));
如果没有引用字段,好友会被正确处理,但对好友的访问对于显示至关重要:在线状态、获取头像 url 等。
我设法同步检索某个用户的好友,但这并不是真正可行的方法,因为我想将更改器包含在用户状态等中。
我对 ngrx/angular 和 typescript 还很陌生,这基本上是我使用这些工具/框架/概念的第一个大项目。
我检查了其他答案,但大多数答案都可以同步解析引用,但这并不是真正的目标,因为需要对用户信息进行观察。
最佳答案
给你,我已经使用了一种方法来解决 ngrx 中的此类问题。
当你对好友进行更改时,不要监听好友的更改。将该监听器作为一个单独的监听器。然后在触发任何操作时对好友执行任何查询。无需担心会立即发生变化。始终从 firestore 获取数据并更新本地存储。
createEffect(() => this.actions$.pipe(
ofType(BuddiesActions.query),
switchMap(() => {
return this.uid$.pipe(
switchMap(uid => {
return this.firestoreService.buddyQuery(uid)
})
)
})
保持你的查询相关效果不变,并删除那里不需要的好友日期获取调用,这些调用会获取好友数据。
然后你需要引入一些像'listen on buddy changes'这样的 Action 来监听数据库的变化。
createEffect(() => this.actions$.pipe(
ofType(BuddiesActions.Listen_ON_BUDDY_CHANGES),
switchMap(() => {
// add listner to firestore and trigger that observable when any data changes happend
const data = action.payload.doc.data();
console.log({data: data});
return {
type: `[Buddies] ${action.type}`,
buddy: {
buddyStatus: data.buddyStatus,
uid: data.uid,
}
};
这应该是一个监听 firestore 中所有变化的可观察对象。当那里发生任何更改时,然后直接使用该数据更新本地 ngrx 存储。如您所料,这是一个异步操作。确保在初始步骤触发“监听好友更改”操作。
关于angular - ngrx 文档引用解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67200531/
我已经建立了这个IStore: export interface IStore { user: IUser; sources: ISourceRedux; } 其中IUser是: export
store.select()发出先前的存储状态。 是否可以订阅从“此刻开始”的更改,而无需获取先前的商店值(value)? 最佳答案 如果您对第一个发出的值不感兴趣,则应该可以使用 skip 运算符:
我已将我的 ngrx 代码更新到版本 8(使用 Action Creator 等),但我现在不知道如何在 NgRx Store DevTools 中使用 Dispatcher。 在我能够发送这样的操作
我正在开发一个新的 angular 4 plus @ngrx 4 项目。 我希望对加载的数据具有搜索功能。 例如,所有联系人信息都已加载到组件中。 联系人列表将过滤与搜索文本匹配的联系人姓名。 Ple
我正在使用 Ngrx 和 Angular2 构建一个移动应用程序。当用户从我的应用程序中注销时,我想清除商店?谁能知道该怎么做? 最佳答案 您应该在每个 reducer 中有一个明确的操作,这将清理商
我看到很多代码示例,其中 store.dispatch() 调用直接发生在 Angular 组件中。让一个愚蠢的 Angular 组件访问整个 Store 不是很糟糕吗?为什么不将所有的 Action
ngrx 的支持者声称 (here for example),您可以并且应该将所有应用程序状态保存在单个 Store 中。这表明 @ngrx/Store 可以用于缓存,因为缓存的内容是一种应用程序状态
我的应用程序在调度某个 Action 时没有调度某些 Action 或某些效果没有被调用,这有问题(请参阅 ngrx effect not being called when action is di
下面的代码片段有什么作用?取自此 file . export const getCollectionLoading = createSelector(getCollectionState, fromC
如果在同一个商店上分派(dispatch)多个操作: store.dispatch(new SomeAction()); store.dispatch(new SomeOtherAction());
我试图了解 typeof 效果在 ngrx 中是如何工作的,如果我在我的应用程序模块中声明: .... @NgModule({ imports: [ EffectsModule
任何人都可以建议在角度应用程序中使用 ngrx 进行状态管理时如何控制台记录状态。我已经浏览了 ngrx-store-logger,但是文档并不清楚如何创建元 reducer 和使用这个库。 最佳答案
我一直在阅读ngrx示例应用程序的代码并找到两个函数调用 createFeatureSelector('auth'); 和 createSelector(selectAuthState,(state:
我正在使用 Angular 8 和 NGRX 8。我有一个操作: export const loadEnvironment = createAction( LicencingActionTypes
我正在使用 Angular 8 和 NGRX 8。我有一个操作: export const loadEnvironment = createAction( LicencingActionTypes
以下示例取自 @ngrx example . 我以这种方式理解这个 observable。第一map函数获取 payload这是要添加的书,再次由mergeMap处理它保存到数据库的位置。 原码:
我目前正在使用 NgRx Data 对我项目中的几个实体执行 CRUD 操作。现在,我必须开发分页。因此,REST API 响应将如下所示: { "page": 1, "per_pag
如何在 NGRX 中访问(读取)另一个 reducer 中的 reducer 状态?这是一个与 this 非常相似的问题.NGRX 是否为此提供任何其他解决方案? 最佳答案 我在考虑做类似的事情时偶然
我正在尝试按属性过滤掉有效负载数据。 //reducer.ts case MessagesActionTypes.LOAD_Message_SUCCESS: { console.lo
我有效果类,我想根据路由器参数 ID 加载详细信息 @Effect() getDetails$ = this.actions$.ofType(DetailActions.GET_DETAILS).
我是一名优秀的程序员,十分优秀!