首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RxJs :如何将数据附加到BehaviourSubject (将最后一个值与新值连接起来)

RxJs :如何将数据附加到BehaviourSubject (将最后一个值与新值连接起来)
EN

Stack Overflow用户
提问于 2020-12-09 11:48:02
回答 1查看 330关注 0票数 1

在我的角应用程序中,我正在使用BehaviourSubject设置一个状态管理逻辑

因此,在我的商店文件中,如下所示:

代码语言:javascript
运行
复制
myStoreData = new BehaviourSubject([])

在我的actions文件中,我得到了以下内容:

代码语言:javascript
运行
复制
export const SAVE_DATA_IN_CONTEXT = '[User] Save user the incoming data';

因此,在组件中,当需要时,调用的方法如下:

代码语言:javascript
运行
复制
click(newData){
  this.reducerService('SAVE_DATA_IN_CONTEXT' , newData)
}

我的目的是,在我的还原器中,我不只是将新的数据发送到商店(behaviourSubject),而是希望它用现有的数据来附加(我不希望新的值替换现有的数据):

因此,它将如下所示:

数据发送给BehaviourSubject (数组)=现有数据(对象数组)+新数据(object)

我的减速机是这样的,我试过:

代码语言:javascript
运行
复制
public dispatchAction(actionTag: string, newDataPayload: any | null): void {
    
    switch (actionTag) {
      case ActionsTags.SAVE_DATA_IN_CONTEXT :
        const newDataToSet = [...Stores.myStoreData.getValue() , ...newDataPayload ];
        Stores.myStoreData.next(newDataPayload);
        break;

}

因为我确信getValue()方法是一种糟糕的实践,所以我不会经过Stores.myStoreData.subscribe(),因为我无法处理取消订阅,并且用户单击方法将是重复的(可能每次订阅都会打开一个新订阅)

我正在寻找一种更好的方式来正确地做这件事(也许改变BehaviouSubject)

建议??

EN

回答 1

Stack Overflow用户

发布于 2020-12-09 13:06:12

正如在您的问题下的一些注释中所解释的,这里有用于此的库,您可能应该使用它们而不是重新发明轮子。

尽管如此,让我们假设这是为了学习的目的,并做它无论如何。

我建议采用反应性编程,并将所有内容构建为流。然后将一个非常小的层变成一个服务来包装它,这样您就可以通过依赖注入来提供它。

对于反应性部分,我只需要一个subject,然后将操作传递给它。在此基础上,我会有一条河流来维持这个州。如下所示:

代码语言:javascript
运行
复制
const action$ = new Subject();

const state$ = action$.pipe(
  scan((state, action) => {
    switch (action.type) {
      case 'some_action':
        // todo: return a new state
      default:
        state;
    }
  })
);

然后,如果您想将其提供到服务中,您可以简单地这样做:

代码语言:javascript
运行
复制
@Injectable()
export class Store {
  private action$ = new Subject();

  public state$ = action$.pipe(
    scan((state, action) => {
      switch (action.type) {
        case 'some_action':
          // todo: return a new state
        default:
          state;
      }
    }),
    shareReplay(1)
  );

  public dispatch(action): void {
    this.action$.next(action)
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65216181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档