加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular 2 Ngrx商店,效果和“短暂状态”

发布时间:2020-12-17 07:10:14 所属栏目:安全 来源:网络整理
导读:在表单组件的上下文中工作: 我试图向用户显示表单的状态“待定,成功,错误,原始”.我不想在商店中拥有这些状态,因为它们是“短暂的状态”. 我有一个影响: @Effect() addTagToVideoEffect_ = this.appState_ .ofType(TagActions.ADD_TAG_TO_VIDEO) .mapAddTa
在表单组件的上下文中工作:

我试图向用户显示表单的状态“待定,成功,错误,原始”.我不想在商店中拥有这些状态,因为它们是“短暂的状态”.

我有一个影响:

@Effect()
  addTagToVideoEffect_ = this.appState_
    .ofType(TagActions.ADD_TAG_TO_VIDEO)
    .map<AddTagToVideo>(action => action.payload)
    .switchMap((addTag: AddTagToVideo) => this.dtsiVideosService.addTagToVideo(addTag)
      .map((addTag: AddTagToVideo) => TagReducers.addTagToVideoComplete(addTag))
      .catch((err) =>Observable.throw(err))
    );

在我的表单组件中,我将调度TagActions.ADD_TAG_TO_VIDEO并订阅它:

onTag(tag: TagEntity) {

    this.subscription = this.tagActions.addTagToVideoEffect_.subscribe(
      this.onAddTagSuccess,this.onAddTagError
    );

    this.tagActions.addTagToVideo({videoId: this.videoId,tag: tag});
}

.tagActions.addTagToVideoEffect_.subscribe导致我的效果被调用两次.如何在没有经过商店的所有短暂状态的情况下获得视图中效果的结果?并没有被称为两次的效果……

解决方法

你两次获得效果调用的原因是因为它只是一个Observable.您需要将其转换为发布者.

@Effect()
  addTagToVideoEffect_ = this.appState_
    .ofType(TagActions.ADD_TAG_TO_VIDEO)
    .map<AddTagToVideo>(action => action.payload)
    .switchMap((addTag: AddTagToVideo) => this.dtsiVideosService.addTagToVideo(addTag)
      .map((addTag: AddTagToVideo) => TagReducers.addTagToVideoComplete(addTag))
      .catch((err) => Observable.throw(err))))
    .share();

然后你可以在你的视图中使用它:

tagFormState_: BehaviorSubject<FormState> = new BehaviorSubject<FormState>({});


  onTag(tag: TagEntity) {

  Observable.from(this.tagActions2.addTagToVideoEffect_)
  .first()
  .toPromise()
  .then(this.onAddTagSuccess,this.onAddTagError)

    this.tagFormState_.next({pending: true});
    this.tagActions.addTagToVideo({videoId: this.videoId,tag: tag});
  }


  onAddTagSuccess = (payload) => {
    this.tagFormState_.next({success: 'Success !'});
    this.resetTagFormState();
  }

  onAddTagError = (err) => {
    this.tagFormState_.next({error: err.message});
    this.resetTagFormState();
  }

  resetTagFormState() {
    setTimeout(_=> {
      this.tagFormState_.next({});
    },1000);
  }

关于这个主题的资源帮助我解决了这个问题:

> https://github.com/ReactiveX/RxJS/issues/1135
> https://github.com/ReactiveX/rxjs/issues/1420
> https://egghead.io/courses/rxjs-subjects-and-multicasting-operators

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读