我有popupservice
这样为我打开弹出组件:
export class PopupService {
alert() { this.matdialog.open(PopupAlertComponent); }
yesno() { this.matdialog.open(PopupYesNoComponent); }
custom() { this.matdialog.open(PopupCustomComponent); }
}
然后,使用
this.popupservice.custom()
打开自定义弹出窗口。export class HomeComponent {
constructor(private popupservice: PopupService) {}
openCustomPopup() {
this.popupservice.custom();
}
}
然后,在我的
custom
弹出窗口组件中,我想调用自己的alert
弹出窗口(报告错误或其他内容):export class CustomPopup {
constructor(private popupservice: PopupService) {}
doHttpCall() {
...do http calls...
if (callFailed) this.popupservice.alert('Call Failed');
}
}
我该如何解决循环依赖问题?
笔记:
我已经阅读了其他问题,但我认为我的问题是一个特定的“帮助我”问题。虽然仍然欢迎您转介我其他问题。
this.popupservice.alert()
不仅仅是一个JavaScript alert
,它是我自己的自定义弹出窗口,具有主题和所有内容。 最佳答案
您可以做的是取消PopupService
中的弹出创建逻辑。这是给您的一些重构。
使用PopupService
仅创建来自应用程序不同部分的事件。
@Injectable()
export class PopupService {
private _alert: Subject<any> = new Subject();
private _yesno: Subject<any> = new Subject();
private _custom: Subject<any> = new Subject();
// since you didn't like the on- methods, you can do following
public readonly alert$ = this._alert.asObservable();
public readonly yesno$ = this._yesno.asObservable();
public readonly custom$ = this._custom.asObservable();
onAlert() { return this._alert.asObservable(); }
onYesno() { return this._yesno.asObservable(); }
onCustom() { return this._custom.asObservable(); }
alert(payload) { this._alert.next(payload); }
yesno(payload) { this._yesno.next(payload); }
custom(payload) { this._custom.next(payload); }
}
因此,我们有一个
PopupService
,它只发出带有某些payload
的事件。我在这里使用Subject
是因为以后的订户不需要知道前面是否有alert
或yesno
事件。如果要具有这种逻辑,可以将Subject
更改为BehaviorSubject
。创建一个名为
PopupManager
的组件,并在app.component
中使用它app.component.ts
@Component({
selector: 'app-root',
template: `
<!-- some template -->
<app-popup-manager></app-popup-manager>
`
})
export class AppComponent {}
@Component({
selector: 'app-popup-manager',
template: '' // don't need to have template
})
export class PopupManagerComponent implements OnInit {
constructor(private matDialog: MatDialog, private popupService: PopupService) {}
ngOnInit() {
this.popupService.onAlert().subscribe(payload => {
// this.matDialog.open...
});
this.popupService.onYesno().subscribe(payload => {
// this.matDialog.open...
});
this.popupService.onCustom().subscribe(payload => {
// this.matDialog.open...
});
}
}
通过这种方式,您可以在所需的任何组件中使用PopupService,因为它现在是单例的独立服务。
为什么不应该将
Subject
暴露给外界?您可以想到这种封装类字段。您确实可以将
_alert
暴露给外界,但是您将无法控制谁以何种方式使用此主题。在保持对字段的某些控制的同时,方法总是提供功能的好方法。将来,您可能想更改服务的内部,也许是某些主题。如果让应用程序的其他部分直接在字段上访问,则必须进行大量重构。但是这样,由于您为他们提供了一些方法,所以只要您不破坏这些方法,就可以了。关于javascript - Angular 圆依赖性解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53512840/