canDeactivate Guard(角度)订阅似乎可以同步工作

时间:2018-08-24 08:21:11

标签: angular observable

问这个问题以供理解:我有以下代码:

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示例有何不同?

0 个答案:

没有答案