在我的Angular 4应用程序中,我有一些带有表单的组件,如下所示:
export class MyComponent implements OnInit,FormComponent { form: FormGroup; ngOnInit() { this.form = new FormGroup({...}); }
他们使用Guard服务来防止未提交的更改丢失,因此如果用户尝试更改路由,则会要求确认:
import { CanDeactivate } from '@angular/router'; import { FormGroup } from '@angular/forms'; export interface FormComponent { form: FormGroup; } export class UnsavedChangesGuardService implements CanDeactivate<FormComponent> { canDeactivate(component: FormComponent) { if (component.form.dirty) { return confirm( 'The form has not been submitted yet,do you really want to leave page?' ); } return true; } }
这是使用一个简单的确认(…)对话框,它工作得很好.
但是我想用更花哨的模态对话框替换这个简单的对话框,例如使用ngx-bootstrap Modal.
如何使用模态来实现相同的结果?
我用
ngx-bootstrap Modals和
RxJs Subjects解决了它.
首先,我创建了一个模态组件:
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<boolean>; constructor(public bsModalRef: BsModalRef) { } action(value: boolean) { this.bsModalRef.hide(); this.subject.next(value); this.subject.complete(); } }
这是模板:
<div class="modal-header modal-block-primary"> <button type="button" class="close" (click)="bsModalRef.hide()"> <span aria-hidden="true">×</span><span class="sr-only">Close</span> </button> <h4 class="modal-title">Are you sure?</h4> </div> <div class="modal-body clearfix"> <div class="modal-icon"> <i class="fa fa-question-circle"></i> </div> <div class="modal-text"> <p>The form has not been submitted yet,do you really want to leave page?</p> </div> </div> <div class="modal-footer"> <button class="btn btn-default" (click)="action(false)">No</button> <button class="btn btn-primary right" (click)="action(true)">Yes</button> </div>
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<FormComponent> { constructor(private modalService: BsModalService) {} canDeactivate(component: FormComponent) { if (component.form.dirty) { const subject = new Subject<boolean>(); const modal = this.modalService.show(ConfirmLeaveComponent,{'class': 'modal-dialog-primary'}); modal.content.subject = subject; return subject.asObservable(); } return true; } }