在我的角应用程序中,我正在使用BehaviourSubject设置一个状态管理逻辑
因此,在我的商店文件中,如下所示:
myStoreData = new BehaviourSubject([])在我的actions文件中,我得到了以下内容:
export const SAVE_DATA_IN_CONTEXT = '[User] Save user the incoming data';因此,在组件中,当需要时,调用的方法如下:
click(newData){
this.reducerService('SAVE_DATA_IN_CONTEXT' , newData)
}我的目的是,在我的还原器中,我不只是将新的数据发送到商店(behaviourSubject),而是希望它用现有的数据来附加(我不希望新的值替换现有的数据):
因此,它将如下所示:
数据发送给BehaviourSubject (数组)=现有数据(对象数组)+新数据(object)
我的减速机是这样的,我试过:
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)
建议??
发布于 2020-12-09 13:06:12
正如在您的问题下的一些注释中所解释的,这里有用于此的库,您可能应该使用它们而不是重新发明轮子。
尽管如此,让我们假设这是为了学习的目的,并做它无论如何。
我建议采用反应性编程,并将所有内容构建为流。然后将一个非常小的层变成一个服务来包装它,这样您就可以通过依赖注入来提供它。
对于反应性部分,我只需要一个subject,然后将操作传递给它。在此基础上,我会有一条河流来维持这个州。如下所示:
const action$ = new Subject();
const state$ = action$.pipe(
scan((state, action) => {
switch (action.type) {
case 'some_action':
// todo: return a new state
default:
state;
}
})
);然后,如果您想将其提供到服务中,您可以简单地这样做:
@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)
}
}https://stackoverflow.com/questions/65216181
复制相似问题