我創建了一個店,在同樣的方式,他們處理國家在RxJS示例應用程序一個國家的用戶商店動作:https://github.com/ngrx/example-app派遣從AngularFireAuth
它工作正常的註冊,登錄,註銷。 ..減速器和效果毫無例外地完成他們的工作。
問題出現在初始狀態(以及來自AngularFire.auth的authstate流)。我想從AngularFireAuth主題設置初始狀態,就像他們在過去的示例應用程序做:https://github.com/angular/angularfire2/blob/master/docs/5-user-authentication.md
在主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)));
}
但是當我接觸到的應用程序,它的顯示,但我得到以下錯誤控制檯:
reducer.js:22 TypeError: Illegal invocation
at http://localhost:4200/vendor.bundle.js:102121:9
at Array.forEach (native)
at deepFreeze (http://localhost:4200/vendor.bundle.js:102118:33)
at http://localhost:4200/vendor.bundle.js:102124:7
at Array.forEach (native)
at deepFreeze (http://localhost:4200/vendor.bundle.js:102118:33)
at http://localhost:4200/vendor.bundle.js:102124:7
at Array.forEach (native).....
,這一個下它:
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)......
我怎麼能在我的商店設置的初始狀態來自AngularFireAuth?這意味着將AuthStates事件從AngularFire.auth發送到我的商店。
我得到同樣的錯誤,如果我改變Af.auth.subscribe此相反:
this.Af.auth.map(authState => new
user.UpdateUserStateAction(authState)).subscribe(store);
編輯:我想補充的工作流程:
用戶登錄與電子郵件,當點擊按鈕它觸發onSignInWithEmail(formValue):
onSignInWithEmail(formValue) {
this.store.dispatch(new user.LogInFromPasswordAction(formValue));
}
的影響recei VES的動作,將用戶數據在我火力地堡數據庫,並觸發動作LogInFromPasswordSuccessAction(finalUser):
@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
};
}
我在商店中保存的是我選擇的用戶數據,以及我創建的用戶模型。
這樣做的原因是讓所有數據和流都在同一個中央存儲中,這樣我就可以訪問「fromRoot」中的任何內容並從同一地點進行更新。
可以請您分享_reducer.js:22_ - 顯然這是錯誤發生的地方,對嗎? – olsn
對不起reducer.js是從商店開發工具(我改進了問題的細節)。減少和效果工作正常,沒有訂閱Af.auth的行並調度行動。是這條線導致的問題,我猜是因爲不可能從訂閱派發操作? – Diego