ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΡΠ±ΡΠΎΡΠΈΡΡ ΡΠΎΡΠΌΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ADD_STORY_SUCCESS
.
Π Π΅ΡΠ΅Π½ΠΈΡ
π€ ΠΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠ»ΡΡ
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΡΡ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
{ isSuccess: boolean }
ΠΠ°ΡΠ΅ΠΌ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠ»ΡΡΠ°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
this.store.select(state => state.story.isSuccess) .filter(v => !!v) .subscribe(() => this.form.reset())
ΠΠ½Π΅ Π½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠ½Π΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π΅ΡΠ΅ key
Π² ΠΌΠΎΠ΅ΠΌ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΎ Π΅Π³ΠΎ ΡΠ±ΡΠΎΡΠ΅.
π ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΠ΅ΡΡ Π½Π° Effect
ΠΡΠ»ΠΈ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ ngrx/effects
, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΡΠ°Π²ΠΈΡΡ effect
Π² ΡΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° Π½Π΅Π³ΠΎ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
@Effect() addStory$ = this.actions$ .ofType('ADD_STORY') .switchMap(action => this.storyService.add(action.payload) .map(story => ({ type: 'ADD_STORY_SUCCESS' })) )
ΠΠ°ΡΠ΅ΠΌ Π² Π²Π°ΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅:
constructor( private storyEffects : StoryEffects) {} storyEffects.addStory$ .filter(action => action.type === 'ADD_STORY_SUCCESS') .subscribe(res => this.form.reset());
ΠΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ Π΄Π²Π΅ Π΄ΠΈΠ»Π΅ΠΌΠΌΡ:
- ΠΠΎΠΆΠ΅Ρ Ρ Π²Π°Ρ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ngrx/effects
.
2. ΠΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ share
. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ Π²Π°Ρ Π±ΡΠ΄Π΅Ρ Π΄Π²Π΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ. (Ρ.Π΅. Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄Π²Π° HTTP-Π²ΡΠ·ΠΎΠ²Π°)
@Effect() addStory$ = this.actions$ .ofType('ADD_STORY') .switchMap(action => this.postsService.add(action.payload) .map(story => ({ type: 'ADD_STORY_SUCCESS' })) ).share()
πͺ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΠ΅ΡΡ Π½Π° ΠΠΈΡΠΏΠ΅ΡΡΠ΅Ρ
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π·Π½Π°ΡΡ, Π½ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· ΡΠ»ΡΠΆΠ±Ρ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Dispatcher
. ΠΠΈΡΠΏΠ΅ΡΡΠ΅Ρ - ΡΡΠΎ Subject
, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡΠ΄Π°ΡΡ.
ΠΡΠ»ΠΈ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° Dispatcher
Π² Π½Π°ΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅.
constructor(private dispatcher: Dispatcher) {} dispatcher.filter(action => action.type === 'ADD_STORY_SUCCESS') .subscribe(() => this.form.reset())
Π― ΡΠ΄Π΅Π»Π°Π» ΡΠ°Π³ Π²ΠΏΠ΅ΡΠ΅Π΄ ΠΈ ΡΠΎΠ·Π΄Π°Π» Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ.
@Injectable() export class AppActions { _actions = new Subject<Action>(); ofType( type : string ) { return this._actions.filter(( action : Action ) => action.type === type); } nextAction( action : Action ) { this._actions.next(action); } } @Injectable() export class MyDispacther extends Dispatcher { constructor( private actions: AppActions ) { super(); } next( action: Action ) { super.next(action); this.actions.nextAction(action); } }
Π― ΡΠ°ΡΡΠΈΡΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ Dispatcher
ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½ΠΎΠ²ΡΠΉ Subject
, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΡΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ.
ΠΠ°ΠΌ ΡΠ°ΠΊΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Angular ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°Ρ Dispatcher
Π²ΠΌΠ΅ΡΡΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π°.
providers: [{ provide: Dispatcher, useClass: MyDispacther }]
Π’Π΅ΠΏΠ΅ΡΡ Π² Π½Π°ΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
constructor( private actions : AppActions) {} actions.ofType('ADD_STORY_SUCCESS') .subscribe(() => this.form.reset())
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ Π²Π°ΡΠΈΡ
ΡΠΎΡΠΌ ΠΊ ngrx/store
.
Ngrx-Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ
ΠΠΎ ΡΡΠΎΠΌΡ ΠΏΠΎΠ²ΠΎΠ΄Ρ Ρ Ρ ΠΎΡΠ΅Π» Π±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π²Π°ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌ Ρ ΡΠ°Π±ΠΎΡΠ°Π» Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·Π±Π°Π²ΠΈΡ Π²Π°Ρ ΠΎΡ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ Π±ΠΎΠ»ΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ ΡΠΎ Π²ΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠΌ Redux.
ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΠ΅ΡΡ Π½Π° ΠΌΠ΅Π½Ρ Π² Medium ΠΈΠ»ΠΈ Twitter, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ± Angular, Vue ΠΈ JS!