从AngularFireAuth发送存储操作

从AngularFireAuth发送存储操作,angular,firebase,rxjs,angularfire2,Angular,Firebase,Rxjs,Angularfire2,我创建了一个具有用户状态的商店,其处理方式与RxJS示例应用程序中用户处理状态的方式相同 它适用于注册、登录、注销。。。减速机和特效毫无例外地完成它们的工作 问题来自初始状态(以及AngularFire.auth中的authstate流)。我想从AngularFireAuth主题设置初始状态,就像在上一个示例应用中一样: 在主app.component.ts中,我只需订阅构造函数中的Af.auth,以便在用户已登录时更新存储,并从我的存储中发送authState: export class Ap

我创建了一个具有用户状态的商店,其处理方式与RxJS示例应用程序中用户处理状态的方式相同

它适用于注册、登录、注销。。。减速机和特效毫无例外地完成它们的工作

问题来自初始状态(以及AngularFire.auth中的authstate流)。我想从AngularFireAuth主题设置初始状态,就像在上一个示例应用中一样:

在主app.component.ts中,我只需订阅构造函数中的Af.auth,以便在用户已登录时更新存储,并从我的存储中发送authState:

export class AppComponent implements OnInit {

showSidenav$: Observable<boolean>;
currentUser$: Observable<User>;
isLoggedIn$: Observable<boolean>;

constructor(private store: Store<fromRoot.State>,
          private router: Router,
          private Af: AngularFire,
          public dialog: MdDialog,
) {
this.showSidenav$ = this.store.select(fromRoot.getShowSidenav);
this.currentUser$ = this.store.select(fromRoot.getCurrentUser);
this.isLoggedIn$ = this.store.select(fromRoot.getIsLoggedIn);
this.Af.auth.subscribe(authState =>
  this.store.dispatch(new UpdateUserStateAction(authState)));
}
下面这个:

client?ffdb:44 [WDS] Disconnected!
如果我尝试登录,它会显示以下内容:

core.es5.js:1084 ERROR TypeError: Cannot assign to read only property '__zone_symbol__xhrScheduled' of function 'function XMLHttpRequest() { [native code] }'
    at ZoneTask.scheduleTask [as scheduleFn] (zone.js:1969)
    at ZoneDelegate.webpackJsonp.662.ZoneDelegate.scheduleTask (zone.js:384)
    at Object.onScheduleTask (zone.js:274)
    at ZoneDelegate.webpackJsonp.662.ZoneDelegate.scheduleTask (zone.js:378)
    at Zone.webpackJsonp.662.Zone.scheduleTask (zone.js:209)
    at Zone.webpackJsonp.662.Zone.scheduleMacroTask (zone.js:232)
    at zone.js:2014
    at XMLHttpRequest.send (eval at createNamedFn (zone.js:1476), <anonymous>:3:31)
    at F.send (auth.js:71)......
编辑:我添加了工作流:

用户使用电子邮件登录,单击按钮时会触发onSignInWithEmail(formValue):

效果接收操作,在我的Firebase数据库中设置用户数据,并触发操作登录FromPasswordSuccessAction(finalUser):

我在商店中保存的是我选择的用户数据,以及我创建的用户模型


这样做的原因是将所有数据和流都放在同一个中央存储中,这样我就可以访问“fromRoot”中的任何内容并且从同一个地方更新。

angular firebase的auth对象似乎与deepFreeze有问题-可能最简单的调试方法是设置断点并逐步完成代码

但一般来说,将非基本对象(在您的示例中为
firebase.User
,名称为
authState
)直接保存到您的存储中并不是一个好的做法。相反,您应该只将相关和必需的信息保存到您的商店(可能是用户名?)。另外,要重新创建身份验证,您仍然需要凭据,因此拥有整个对象在这里没有多大帮助


另外:既然
this.Af.auth
已经是一个可观察的文件,为什么您需要将内容保存到您的存储中,它已经可以以类似流的方式进行访问。

angular firebase的auth对象似乎与deepFreeze有问题-可能最简单的调试方法是设置断点并逐步完成代码

但一般来说,将非基本对象(在您的示例中为
firebase.User
,名称为
authState
)直接保存到您的存储中并不是一个好的做法。相反,您应该只将相关和必需的信息保存到您的商店(可能是用户名?)。另外,要重新创建身份验证,您仍然需要凭据,因此拥有整个对象在这里没有多大帮助


另外:既然
this.Af.auth
已经是一个可观察的文件,为什么您需要将内容保存到您的存储中,它已经可以以流式方式访问了。

您可以共享reducer.js:22-显然这就是错误发生的地方,对吗?很抱歉reducer.js来自存储开发工具(我改进了问题中的细节).reducer和effects在没有订阅Af.auth并分派操作的行的情况下工作正常。我想是这行导致了问题,因为无法从订阅中分派操作吗?您可以共享reducer.js:22-显然这就是错误发生的地方,对吗?抱歉,reducer.js来自商店devtools(我改进了问题中的细节).reducer和effects在没有订阅Af.auth并分派操作的行的情况下可以正常工作。我想是这行导致了问题,因为无法从订阅分派操作吗?我添加了工作流。我只是将所需的用户数据保留在存储中,并且每当从中发送事件时,我都要更新该状态Af.auth。我只是想不必在需要用户数据时导入Af.auth,而只需导入fromRoot。好的,但是您应该复制该用户对象的内容,因为冻结某个外部模块提供的对象从来都不是一个好主意,这很可能会导致该外部模块中出现一些问题。好吗!谢谢。我想你的意思是使用Object.assign()?另外,您知道如何通过从Af.auth接收数据来更新fromRoot中用户的状态吗?例如,通过复制数据,但不将对象作为参考-但是如果
object.assign
足够,或者如果您必须进行深度复制,我无法确定,因为我没有完整的接口a
firebase.user-目前在我脑子里上课;-)谢谢。最后,我将处理来自可观察的可注入服务的用户状态,而不是来自存储。每当我需要用户的当前状态时,我就会注入服务。我尝试的方法太麻烦了…我添加了工作流。我只是将所需的用户数据保存在存储中,并希望在从Af.auth发送事件时更新该状态。我只是想不必在需要用户数据时导入Af.auth,只需导入fromRoot。好的,但是您应该复制该用户对象的内容,因为冻结某个外部模块提供的对象从来都不是一个好主意,这很可能会在该外部模块中引起一些问题。好的!非常感谢。我想你的意思是使用Object.assign()?另外,您知道如何通过从Af.auth接收数据来更新fromRoot中用户的状态吗?例如,通过复制数据,但不将对象作为参考-但是如果
object.assign
足够,或者如果您必须进行深度复制,我无法确定,因为我目前头脑中没有完整的接口a
firebase.User
-类;-)非常感谢。最后,我将处理来自可观察的可注入服务的用户状态,而不是来自存储。每当我需要用户I的当前状态时
core.es5.js:1084 ERROR TypeError: Cannot assign to read only property '__zone_symbol__xhrScheduled' of function 'function XMLHttpRequest() { [native code] }'
    at ZoneTask.scheduleTask [as scheduleFn] (zone.js:1969)
    at ZoneDelegate.webpackJsonp.662.ZoneDelegate.scheduleTask (zone.js:384)
    at Object.onScheduleTask (zone.js:274)
    at ZoneDelegate.webpackJsonp.662.ZoneDelegate.scheduleTask (zone.js:378)
    at Zone.webpackJsonp.662.Zone.scheduleTask (zone.js:209)
    at Zone.webpackJsonp.662.Zone.scheduleMacroTask (zone.js:232)
    at zone.js:2014
    at XMLHttpRequest.send (eval at createNamedFn (zone.js:1476), <anonymous>:3:31)
    at F.send (auth.js:71)......
this.Af.auth.map(authState => new 
  user.UpdateUserStateAction(authState)).subscribe(store);
  onSignInWithEmail(formValue) {
    this.store.dispatch(new user.LogInFromPasswordAction(formValue));
  }
  @Effect()
  logInFromPassword$: Observable<Action> = this.actions$
    .ofType(user.ActionTypes.LOG_IN_FROM_PASSWORD)
    .flatMap((action) => Observable.fromPromise(<Promise<any>>this.userService.loginWithEmail(action.payload))
    .flatMap((data) => Observable.of(this.userService.setUserData(data.auth))
    .map((finalUser) => new user.LogInFromPasswordSuccessAction(finalUser))));
case user.ActionTypes.LOG_IN_FROM_PASSWORD_SUCCESS: {
  const commingUser = action.payload;
  return {
    data: commingUser,
    isLoggedIn: true
  };
}