2017-04-19 32 views
0

我創建了一個店,在同樣的方式,他們處理國家在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」中的任何內容並從同一地點進行更新。

+0

可以請您分享_reducer.js:22_ - 顯然這是錯誤發生的地方,對嗎? – olsn

+0

對不起reducer.js是從商店開發工具(我改進了問題的細節)。減少和效果工作正常,沒有訂閱Af.auth的行並調度行動。是這條線導致的問題,我猜是因爲不可能從訂閱派發操作? – Diego

回答

2

似乎來自angular-firebase的auth-object與deepFreeze有關係 - 可能最簡單的調試方法是設置斷點並逐步執行代碼。

但一般來說,採取非原始對象(您的情況爲firebase.User,名稱爲authState)並不是一個好習慣,並將它們直接保存到您的商店。相反,您應該只將相關信息和必需的信息保存到您的商店(可能是用戶名?)。同樣爲了重新創建身份驗證,無論如何你都需要證書,所以讓整個對象在這裏沒有什麼幫助。

此外:由於this.Af.auth已經是可觀察的,您爲什麼需要將內容保存到您的商店,它已經可以以類流的方式訪問。

+0

我添加了工作流程。我只需在商店中保存我需要的用戶數據,並且我想在每次從Af.auth發送事件時更新該狀態。我只想在不需要用戶數據的時候導入Af.auth,而只需要導入fromRoot。 – Diego

+1

好的,但是您應該複製該用戶對象的內容,因爲凍結某個外部模塊提供的對象從來就不是一個好主意,這很可能會導致該外部模塊出現問題。 – olsn

+0

好的!謝謝。我想你的意思是使用Object.assign()?另外,您是否知道如何通過從Af.auth接收數據來更新fromRoot中的用戶狀態? – Diego