CanDeactivate не работает должным образом, после нажатия кнопки браузера назад - PullRequest
0 голосов
/ 28 января 2020

Я реализовал canDeactive guard, после нажатия кнопки браузера появляется Модель и спрашивается Да / Нет. После нажатия кнопки «Нет» она остается на той же странице, и снова, если я нажимаю кнопку «Назад», появляется всплывающее окно, а после нажатия кнопки «Нет / Да» она перенаправляет на пустой URL-адрес страницы из истории браузера, а не остается на том же URL-адресе.

Пожалуйста, найдите код для отключения охраны.

import { Injectable, HostListener, } from '@angular/core';
import { CanDeactivate, ActivatedRoute, Router, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router';
:
:
:
:

export abstract class myCompCanDeactivate {

  abstract  canDeactivate(): boolean;

    @HostListener('window:beforeunload', ['$event'])
    unloadNotification($event: any) {
        if (!this.canDeactivate()) {
            $event.returnValue = true;
        }
    }
}

@Injectable()

export class DeactivateGuardService implements CanDeactivate<myCompCanDeactivate> {
  showDashboard:boolean=false;
  islogout:any;
  sStep:number;
  demoLastSection:number = 0;
  menuitem:SitefinityPortalMenu;

  constructor(private next:ActivatedRoute,private resourceService: ResourceService,
    private matDialog: MatDialog,private browserGlobalService: BrowserGlobalService, private route:Router ){}
  async canDeactivate(component: myCompCanDeactivate,currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, nextState?: RouterStateSnapshot): Promise<boolean> {

    if(!component.canDeactivate()){

      if (this.browserGlobalService.GlobalLogout=== 'logout') {
          this.browserGlobalService.GlobalLogout = '';
          return true;
        }

      //Get Portal left menus from sitefinity.
      this.menuitem = await this.resourceService.getPortalMenus("Portal_Left_Menu").toPromise();


      var str:SitefinityMenuItem[] = this.menuitem.MenuItems.filter((m)=>{return m.LinkUrl.includes(nextState.url) && m.Hidden===false});

      if ( nextState.url!='/demoSite' && nextState.url === (str.length>0?str[0].LinkUrl:'') ){return true; }

      this.sStep = SaleSteps.Review;
      this.demoLastSection = PSSections.signStep;


      if (this.browserGlobalService.PLSavedSection !=  this.demoLastSection || this.browserGlobalService.PLSavedSection != this.sStep ){
      let modalData = new ModalData();
      modalData.Header = this.resourceService.getViewLabel("ModalHeader_BrowserBack"); 
      modalData.Body = this.resourceService.getViewLabel("ModalBody_BrowserMessage"); 
      modalData.ControlArray = [
        new ButtonAction(this.resourceService.getViewLabel("ModalCancel_Yes"), "YES"),
        new ButtonAction(this.resourceService.getViewLabel("ModalCancel_No"), "NO")
      ];
          let dialogRef = this.matDialog.open(GspModalComponent, {
              data:  modalData
          });
          dialogRef.afterClosed().subscribe(result => {
               if (result && result.toLowerCase() === "yes") {
                  this.browserGlobalService.callComponentMethod("");
                  // this.route.navigated = true;
                  return false;
                }
                return false;
          });
        }
    }
    return false;
  }
}

1 Ответ

0 голосов
/ 03 февраля 2020

Я нашел решение этой проблемы. Решение: history.pushState ("", "", "/ sales"); (только что нажал состояние маршрутизатора в истории браузера) Так как в моем случае URL всегда остается неизменным, поэтому всякий раз, когда нажималась кнопка возврата браузера, выполнялась активность браузера по умолчанию. поэтому он извлекает состояние из истории и достигает последнего состояния истории, после чего браузер переходит на пустую страницу.

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