路由守卫 CanDeactivate

Observerable + nzModal + CanDeactivate

我们这里的离开的逻辑是,如果没有编辑过内容,就直接离开。如果有编辑过内容就询问是否需要离开。
首先创建QuoteFormCanDeactivate.ts文件:

import {Injectable} from '@angular/core';
import {CanDeactivate} from '@angular/router';
import {QuoteFormComponent} from './quote-form.component';
import {Observable} from 'rxjs';

export interface CanComponentDeactivate {
  canDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
  isFormDirty:() => boolean;
}

@Injectable()
export class QuoteFormCanDeactiveate implements CanDeactivate<CanComponentDeactivate>{
  canDeactivate(component:QuoteFormComponent):Observable<boolean>|boolean{
    if(component.isFormDirty()){
      return component.canDeactivate();
    }else{
      return true;
    }
  }
}

然后在routing文件配置路由守卫:

{path:"createquote",component:QuoteFormComponent,canDeactivate:[QuoteFormCanDeactiveate]},

我们在QuoteFormComponent中实现

 canDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
 isFormDirty:() => boolean;

这两个方法。
quote-form.component.html:

<nz-modal  [(nzVisible)]="cdmVisible" nzTitle="确认要离开这个页面吗?" (nzOnCancel)="cancelDeactivateHandler()" (nzOnOk)="deactivateHandler()">
  <div>这个页面有未提交的的信息,如果离开页面将丢失所有未提交的信息。确认要离开这个页面吗?</div>
</nz-modal>

quote-form.component.ts

private deactivateObservable : Observable<boolean>;
private deactivateObser : Observer<boolean>;
ngOnInit(){
....
  this.deactivateObservable = new Observable<boolean>(observer=>{
       this.cdmVisible = true;
       this.deactivateObser = observer;
     });
.....
}
isFormDirty():boolean{
     return this.baseForm.getFormIsDirty();
   }
canDeactivate():Observable<boolean> | boolean{
    return this.deactivateObservable;
  }
  cancelDeactivateHandler(){
     this.cdmVisible = false;
     this.deactivateObser.next(false);
  }
  deactivateHandler(){
    this.deactivateObser.next(true);
  }

如果form没有被编辑过,那么跳转就可以直接跳转。
如果有编辑过,就会弹出modal框,询问用户是否确认要跳转了。用户确认后可以跳转,如果用户点取消,那么跳转也会被取消。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,422评论 3赞 119
  • 要说起这段时期最火爆的热点 既不是八卦的娱乐圈 也不是动荡的国际局势 而是现如今国内的楼市,楼市啊! 一周前,小满...
    笑揖轻风阅读 225评论 0赞 1
  • 01 别人给你发消息一定要回 就算不想聊也可以告诉他 哪怕是用表情或者标点来委婉的表达 不回消息不是高冷 是没教养...
    沙仑de玫瑰阅读 1,019评论 0赞 1
  • 大侠低下头,望着自己胸口被师太绣花针扎过的地方。 曾经肌肉饱绽的胸部已经有点下垂,这让人感觉很不好...
    成都独行侠阅读 535评论 0赞 0
  • 走在这繁杂的路上,不知道哪一条属于自己,不知道哪个人留在心里,也不知道自己是谁。越来越多的成功学,但什么是...
    未半于阅读 299评论 1赞 3

友情链接更多精彩内容