html - 传递这样的函数的好习惯?
问题描述
我有以下场景,我在组件 A 中订阅了一个主题 ( service.save
),并且我想在此事件发生之前调用组件 B、C、D、E 的一些函数。我想到了这样的事情:
//Component A only one subscribing
this.service.save.subscribe((event)=>{
this.sharedService.beforeSaveFunctions.forEach(fn => {
fn(event);
});
// ... do something
});
@Injectable()
export class SharedService{
beforeSaveFunctions: any[];
registerBeforeSaveFunction(fn:any){
this.beforeSaveFunctions.push(fn);
}
}
//Component B, C, D, ...
ngOnInit(): void {
this.sharedService.registerBeforeSaveFunction(handleSave.bind(this));
}
handleSave(event){
//Do something..
}
因此,每个组件都可以调用this.sharedService.registerBeforeSaveFunction()
以传递自己的函数,该函数稍后会在组件 A 中的订阅上执行。
这是好风格吗?我无法访问包含save
主题的服务,因为它是一个外部库。如果我在每个组件中都订阅它,并且每个组件都做它自己的事情,那么它会变得一团糟,并且我会遇到一个订阅在另一个之前完成的异步问题。
解决方案
我可能会将外部库服务包装在“SharedService”中,并将“保存”Observable 作为 SharedService 的成员公开,如下所示:
// Component A only one subscribing
this.sharedService.save.subscribe((event) => {
// ... do something
});
@Injectable()
export class SharedService {
save = this.service.save
.pipe(
tap(event => this.beforeSaveFunctions.forEach(fn => fn(event)))
);
constructor(private service: Service) { }
beforeSaveFunctions: any[];
registerBeforeSaveFunction(fn: any) {
this.beforeSaveFunctions.push(fn);
}
}
//Component B, C, D, ...
ngOnInit(): void {
this.sharedService.registerBeforeSaveFunction(handleSave.bind(this));
}
handleSave(event){
//Do something..
}
推荐阅读
- c# - 返回接口时是否存在性能损失?
- python - 如何使用日期时间在python中使用if命令检查工作日
- reactjs - 使用 useReducer 在两个组件之间共享状态
- amazon-web-services - AWS CLI S3 同步从阵列中排除文件夹
- xamarin.forms - iOS 推送通知设置 One Signal Xamarin
- apache-spark - 镶木地板顶部的外部蜂巢表不返回数据
- rest - Spring cloud函数中处理REST参数的推荐方式
- sql - 是否可以在 Oracle for 循环中运行存储过程?
- firebase - 反应原生。如何根据用户验证状态显示屏幕
- excel - 如何使用 VBA 在 Excel 中正确添加表格列?