Angular use modal dialog in canDeactivate Guard service for unsubmitted changes (Form dirty)

前端 未结 7 2558
北荒
北荒 2020-12-05 19:35

In my Angular 4 application I have some components with a form, like this:

export class MyComponent implements OnInit, FormComponent {

  form: FormGroup;

          


        
7条回答
  •  孤城傲影
    2020-12-05 19:47

    I solved it using ngx-bootstrap Modals and RxJs Subjects.

    First of all I created a Modal Component:

    import { Component } from '@angular/core';
    import { Subject } from 'rxjs/Subject';
    import { BsModalRef } from 'ngx-bootstrap';
    
    @Component({
      selector: 'app-confirm-leave',
      templateUrl: './confirm-leave.component.html',
      styleUrls: ['./confirm-leave.component.scss']
    })
    export class ConfirmLeaveComponent {
    
      subject: Subject;
    
      constructor(public bsModalRef: BsModalRef) { }
    
      action(value: boolean) {
        this.bsModalRef.hide();
        this.subject.next(value);
        this.subject.complete();
      }
    }
    

    here's the template:

    
    
    
    

    Then I modified my guard using a Subject, now it look like this:

    import { CanDeactivate } from '@angular/router';
    import { FormGroup } from '@angular/forms';
    import { Injectable } from '@angular/core';
    import { Subject } from 'rxjs/Subject';
    import { BsModalService } from 'ngx-bootstrap';
    
    import { ConfirmLeaveComponent } from '.....';
    
    export interface FormComponent {
      form: FormGroup;
    }
    
    @Injectable()
    export class UnsavedChangesGuardService implements CanDeactivate {
    
      constructor(private modalService: BsModalService) {}
    
      canDeactivate(component: FormComponent) {
        if (component.form.dirty) {
          const subject = new Subject();
    
          const modal = this.modalService.show(ConfirmLeaveComponent, {'class': 'modal-dialog-primary'});
          modal.content.subject = subject;
    
          return subject.asObservable();
        }
    
        return true;
      }
    }
    

    In app.module.ts file go to the @NgModule section and add the ConfirmLeaveComponent component to entryComponents.

    @NgModule({
      entryComponents: [
        ConfirmLeaveComponent,
      ]
    })
    

提交回复
热议问题