2017-02-09 16 views
0

Iは、認証が必要なソースからデータをフェッチAngular2アプリを持っているので、アプリケーション・コンポーネントの初期化イベントは、認証トークンは次のようにフェッチを開始:ReplaySubject.next(value)はreduxストアの不変状態の原則に違反していますか?

import { Component, OnInit } from '@angular/core'; 
import { NgRedux } from '@angular-redux/store'; 
import { rootReducer } from './app.reducer'; 
import * as createLogger from 'redux-logger'; 
import { AppActions } from './app.actions'; 
import { createEpicMiddleware, combineEpics } from 'redux-observable'; 
import { UserEpics } from './users/user.epics'; 
import { ReplaySubject } from 'rxjs/ReplaySubject'; 

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.css'] 
}) 
export class AppComponent implements OnInit { 
    constructor(
    private ngRedux: NgRedux<any>, 
    private actions: AppActions, 
    private userEpics: UserEpics, 
) { 
    ngRedux.configureStore(
     rootReducer, 
     { user: { auth: { token$: new ReplaySubject(1) } } }, 
     [ 
     createLogger(), 
     createEpicMiddleware(combineEpics(...userEpics.epics)), 
     ]); 
    } 
    ngOnInit() { 
    this.ngRedux.dispatch(this.actions.getAuthToken()); 
    } 
} 

reduxがRxjs5 ReplaySubjectを記憶している、そしてこの主題になりますこのような減速からトークン値を与え:

case AppActions.GET_AUTH_TOKEN_DONE: 
    user.auth.token$.next(action.token); 
    return Object.assign({}, user, { 
    auth: { 
     isFetching: false, 
     token$: user.auth.token$, 
     reason: undefined 
    } 
}); 

このコードは私のために働いているが、それは、Reduxの店の不変状態原理に違反していますか?

答えて

2

私はそれがないと言うだろう - あなたは.next(...)を呼び出すことにより、どこからでも状態を変異させることができるので - それは代わりにSubjectObservableだった場合、それは少し違うかもしれない - しかし、いずれにしても、私は個人的にそれがあると思いますObservablesを状態の一部として保存することは悪いことです。

+1

これは実際にはお勧めできません。実際にシリアル化していない場合でも、ストア内のすべてのものはシリアル化可能でなければなりません。あなたはそれについて宗教的である必要はありません - もしそれが今まで使用されていない事故に何かを含んでいたら - それに頼るのは悪い形です。そのすべては、義のための容易な明確な道がなければ、それを出荷するが、それを習慣にしないでください。少なくともそれは私の意見です。私はなぜSubjectを必要と感じているのかを知る必要があります。例えばあなたの叙事詩コード。あなたは、件名のない状態で店内にトークンを設定するだけのようですね。 – jayphelps

+0

@jayphelpsありがとう、私はそれほど疑わしい。私は、ビューデータを取得するためにauthトークンに依存するコンポーネントを満たすためにこれを一時的に行いました。これを、[@ angular-redux/store](https://github.com/angular-redux/store/blob/master)を使用して、ストアの認証トークンのサブスクリプションによってコンポーネントルートが保護されているスキームに再設定しました/docs/select-pattern.md) –

関連する問題