canDeactivate guard (angular) подписка работает синхронно - PullRequest
0 голосов
/ 24 августа 2018

Задавая этот вопрос для понимания: у меня есть этот код:

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 ... находится после и вне подписки. Согласно синхронному потоку, ifдолжен быть оценен до того, как значение this.editmode будет установлено асинхронно и оценено как ложное. Но код работает! Оба способа. If оценивает значение true, если я отправляю наблюдаемое из true из hasChanges асинхронно и появляется диалоговое окно!не устанавливайте this.editMode равным true где-либо ранее. Как это работает? В любой другой ситуации, если бы у нас была подписка и синхронный код, использующий значение из подписки извне, мы бы его не получили. Например:

this.someService.getData().subscribe(data => this.source = data)
console.log(this.source)

Здесь напечатанное значение this.source не было бы значением данных из вызова db / back-end / resource. Было бы напечатано undefined или что-то еще, что было установлено ранее. Как эта асинхронность работает синхронно вcanDeactivate затем?

Кажется, в этом вопросе приводятся аргументыestion здесь когда спрашивающий говорит "Поскольку значение this.savingState в стороже всегда подписано, я не думаю, что проблема с условным условием приведена ниже." .Но я не понимаю этого.Что всегда подписано?Что же тогда не всегда подписывается ?Или что мы делаем специально, чтобы всегда подписывался?Опять же, мой вопрос, как это отличается от примера getData?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...