После перемещения состояния очистка состояния влияет на другое состояние - PullRequest
0 голосов
/ 09 октября 2018

Я новичок в ngrx и у меня проблема с отпиской.Я использую как последние версии Angular, так и ngrx.

У меня есть CreateState и ModelState.После создания CreateState в диалоге я хочу скопировать CreateState как часть ModelState и затем очистить CreateState, чтобы диалог стал пустым.

Для этого я сначала получаю все состояние CreateState, а затем вызываю ActionModelState для копирования.

this.store$.select(CreateSelectors.selectCreateState).subscribe((state: CreateState.State) => {
  this.store$.dispatch(new ModelActions.CreateAction(state));
  this.router.navigateByUrl('/canvas');
});

После того, как я перешел на новую страницу, я вызываю действие для CreateState для очистки.

ngOnInit() {
    this.store$.dispatch(new CreateActions.ClearAction());
}

Но похоже, что Выбрать подписку из моегопервая страница все еще прослушивает, поэтому при очистке CreateState запускается выбор и снова отправляется ModelActions.CreateAction.

Я пытался прослушивать только для .first() Observable или отписываться от Observable, но Typescript говорит, что функции для.first() или .unsubscribe().

Я что-то не так делаю?Должен ли я использовать другой подход для перемещения и очистки состояний?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

вы должны запустить ваш код через канал, там вы можете использовать оператор first ().

this.store$.select(CreateSelectors.selectCreateState).pipe(
first(), // should unsubscribe after first iteration
tap( (state: CreateState) => {
      this.store$.dispatch(new ModelActions.CreateAction(state));
      this.router.navigateByUrl('/canvas');
})
).subscribe();

Или вы можете установить переменную и подписаться на нее.

const subscription = this.store$.select(CreateSelectors.selectCreateState).pipe(
tap( (state: CreateState) => {
      this.store$.dispatch(new ModelActions.CreateAction(state));
      this.router.navigateByUrl('/canvas');
})
);

// if you don't subscribe nothing will happen
// unsubscribes after first iteration
subscription.first().subscribe(); 

некоторая документация:

живая демонстрация first ()

документация first () RxJS Documentation learn-rxjs

0 голосов
/ 09 октября 2018

Вы подписываетесь на наблюдаемое, которое возвращается из функции выбора.Вам необходимо сохранить эту наблюдаемую переменную в переменной, чтобы вы могли ссылаться на нее.

Затем вы можете использовать эту переменную, чтобы отписаться от

...