Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ дСйствиС.

НапримСр, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ дСйствиС 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());

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π΄Π²Π΅ Π΄ΠΈΠ»Π΅ΠΌΠΌΡ‹:

  1. ΠœΠΎΠΆΠ΅Ρ‚ Ρƒ вас Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 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!