问这个问题以供理解:我有以下代码:
export class TpaEditGuard implements CanDeactivate<ResultContainerComponent> {
public editMode: boolean;
public bsModalRef: BsModalRef;
constructor(
private injector: Injector,
private modalService: BsModalService
) { }
public canDeactivate(
target: ResultContainerComponent,
currentRoute: ActivatedRouteSnapshot,
currentState: RouterStateSnapshot,
nextState: RouterStateSnapshot): Observable<boolean> | boolean {
target.hasChanges().subscribe((value) => {
this.editMode = value;
});
if (this.editMode) {
let subject = new Subject<any>();
this.bsModalRef = this.modalService.show(NavigateConfirmComponent,
{ animated: true, keyboard: false, backdrop: false, ignoreBackdropClick: true }
);
this.bsModalRef.content.navEvent = subject;
return this.bsModalRef.content.shouldNavigate();
} else {
return true;
}
}
现在,if(this.editMode ...在.subscribe的后面和外面。根据同步流,应该在this.editmode的值异步设置为false之前评估if。代码有效!两种方式。如果我从hasChanges异步发送一个可观察的true值并且对话框出现,则if的评估结果为true!我没有在更早的任何地方将this.editMode设置为true。如何工作? 在任何其他情况下,如果我们使用外部订阅中的值进行订阅和同步代码,则将无法获得该代码。例如:
this.someService.getData().subscribe(data => this.source = data)
console.log(this.source)
这里,输出的this.source的值将不是db / back-end / resource调用中的数据的值。它将打印未定义的内容或之前设置的内容。那么异步如何在canDeactivate中同步工作?
问题发问人说时,似乎在此问题here中提供了推理:“由于值守总是始终遵守守卫this.savingState的值,所以我认为条件条件不存在问题进入下面。” 。但是我不明白。总是订阅什么?那么,并不总是订阅是什么呢?或者,我们有什么特别的办法让它总是被订阅?再次,我的问题与getData示例有何不同?