我应该重构我的项目以使用 NGRX 吗?
Should I refactor my project to use NGRX?
我正在开发一个类似于保险 CRM 的企业前端。这是我的第一个大型 Angular 项目,这也是我直到现在才使用 NGRX 的原因。相反,我为合同列表、合同详细信息等每个页面创建了一个 StateService,使用状态对象和行为主体来使状态具有反应性。但是现在我必须在每个使用此服务的组件中订阅、取消订阅和实现一个 updateState 函数。
我想从长远来看这将是一种反模式,可能是投资 NGRX 的时候了。你能告诉我你的两分钱吗?你将如何处理状态管理?请记住,我的时间有点短,因为第一个版本的截止日期是两个月。
抱歉,我知道这是一个自以为是的问题,但我希望获得一些不同的状态管理方法
您没有为您的解决方案包含任何特定代码,但您可以使用简单的 select / 修改函数来模仿 redux 模式。
@Injectable({ providedIn: 'root' })
export class StateService {
state: StateModel;
stateSubject$: BehaviorSubject<any>;
constructor() {
this.setInitialState();
this.stateSubject$ = new BehaviorSubject<any>(this.state);
}
select(propPath: keyof StateModel | '' = ''): Observable<any> {
let observable: Observable<any> = this.stateSubject$.asObservable();
if (propPath.length > 0) {
propPath.split('.').forEach((prop) => {
observable = observable.pipe(map((state) => state[prop]));
});
}
return observable;
}
modify(modFn: (state: StateModel) => Partial<StateModel>) {
this.state = { ...this.state, ...modFn(this.state) };
this.stateSubject$.next(this.state);
}
setInitialState() {
this.state = {
someProp: { a: 10, b: 20 },
somethingElse: 'Hello world',
};
}
}
用法
// some.component
// select a value from your state
this.somethingElse = state.select('somethingElse');
this.a = state.select('someProp.a');
// modify the state
state.modify((state) => ({ somethingElse: 'Foobar' }));
state.modify((state) => ({ someProp: { a: 310, b: state.someProp.b } }));
您不必 re-implement 任何逻辑,因为状态修改只是一个回调函数,returns 覆盖当前状态对象的状态模型的部分对象。
这种方法类似于 Redux 模式,但消除了稳定库的所有样板和“安全性”。
我正在开发一个类似于保险 CRM 的企业前端。这是我的第一个大型 Angular 项目,这也是我直到现在才使用 NGRX 的原因。相反,我为合同列表、合同详细信息等每个页面创建了一个 StateService,使用状态对象和行为主体来使状态具有反应性。但是现在我必须在每个使用此服务的组件中订阅、取消订阅和实现一个 updateState 函数。
我想从长远来看这将是一种反模式,可能是投资 NGRX 的时候了。你能告诉我你的两分钱吗?你将如何处理状态管理?请记住,我的时间有点短,因为第一个版本的截止日期是两个月。
抱歉,我知道这是一个自以为是的问题,但我希望获得一些不同的状态管理方法
您没有为您的解决方案包含任何特定代码,但您可以使用简单的 select / 修改函数来模仿 redux 模式。
@Injectable({ providedIn: 'root' })
export class StateService {
state: StateModel;
stateSubject$: BehaviorSubject<any>;
constructor() {
this.setInitialState();
this.stateSubject$ = new BehaviorSubject<any>(this.state);
}
select(propPath: keyof StateModel | '' = ''): Observable<any> {
let observable: Observable<any> = this.stateSubject$.asObservable();
if (propPath.length > 0) {
propPath.split('.').forEach((prop) => {
observable = observable.pipe(map((state) => state[prop]));
});
}
return observable;
}
modify(modFn: (state: StateModel) => Partial<StateModel>) {
this.state = { ...this.state, ...modFn(this.state) };
this.stateSubject$.next(this.state);
}
setInitialState() {
this.state = {
someProp: { a: 10, b: 20 },
somethingElse: 'Hello world',
};
}
}
用法
// some.component
// select a value from your state
this.somethingElse = state.select('somethingElse');
this.a = state.select('someProp.a');
// modify the state
state.modify((state) => ({ somethingElse: 'Foobar' }));
state.modify((state) => ({ someProp: { a: 310, b: state.someProp.b } }));
您不必 re-implement 任何逻辑,因为状态修改只是一个回调函数,returns 覆盖当前状态对象的状态模型的部分对象。
这种方法类似于 Redux 模式,但消除了稳定库的所有样板和“安全性”。