Angular 2.0 และ Modal Dialog


128

ฉันกำลังพยายามหาตัวอย่างเกี่ยวกับวิธีการทำกล่องโต้ตอบการยืนยันใน Angular 2.0 ฉันใช้กล่องโต้ตอบ Bootstrap สำหรับ Angular 1.0 และไม่พบตัวอย่างใด ๆ ในเว็บสำหรับ Angular 2.0 ฉันยังตรวจสอบเอกสาร 2.0 เชิงมุมโดยไม่มีโชค

มีวิธีการใช้กล่องโต้ตอบ Bootstrap กับ Angular 2.0 หรือไม่?


ฉันพบตัวอย่างนี้แล้ว บางทีมันอาจจะช่วยให้คุณangularscript.com/angular2-modal-window-with-bootstrap-style
Puya Sarmidani

1
ฉันใช้อันนี้กับ RC3 และเนื้อหาที่น่ารักด้วย: valor-software.com/ng2-bootstrap/#/modals
mentat

ขอบคุณ @Sam ฉันเริ่มต้นได้ดี อย่างไรก็ตามฉันสังเกตเห็นว่าองค์ประกอบการโทรไม่ทราบว่าคลิกปุ่มใด หลังจากการวิจัยบางอย่างฉันสามารถใช้ Observables แทน EventEmitters เพื่อหาวิธีแก้ปัญหาที่หรูหรากว่า
Jon


@mentat, url ที่อัพเดตvalor-software.com/ngx-bootstrap/#/modals
Anand Rockzz

คำตอบ:


199
  • เชิงมุม 2 ขึ้นไป
  • Bootstrap css (เก็บภาพเคลื่อนไหวไว้)
  • ไม่มี JQuery
  • ไม่มี bootstrap.js
  • รองรับเนื้อหากิริยาที่กำหนดเอง (เช่นเดียวกับคำตอบที่ยอมรับได้)
  • เพิ่งเพิ่มการสนับสนุนสำหรับModals หลายด้านบนของแต่ละอื่น ๆ

`

@Component({
  selector: 'app-component',
  template: `
  <button type="button" (click)="modal.show()">test</button>
  <app-modal #modal>
    <div class="app-modal-header">
      header
    </div>
    <div class="app-modal-body">
      Whatever content you like, form fields, anything
    </div>
    <div class="app-modal-footer">
      <button type="button" class="btn btn-default" (click)="modal.hide()">Close</button>
      <button type="button" class="btn btn-primary">Save changes</button>
    </div>
  </app-modal>
  `
})
export class AppComponent {
}

@Component({
  selector: 'app-modal',
  template: `
  <div (click)="onContainerClicked($event)" class="modal fade" tabindex="-1" [ngClass]="{'in': visibleAnimate}"
       [ngStyle]="{'display': visible ? 'block' : 'none', 'opacity': visibleAnimate ? 1 : 0}">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <ng-content select=".app-modal-header"></ng-content>
        </div>
        <div class="modal-body">
          <ng-content select=".app-modal-body"></ng-content>
        </div>
        <div class="modal-footer">
          <ng-content select=".app-modal-footer"></ng-content>
        </div>
      </div>
    </div>
  </div>
  `
})
export class ModalComponent {

  public visible = false;
  public visibleAnimate = false;

  public show(): void {
    this.visible = true;
    setTimeout(() => this.visibleAnimate = true, 100);
  }

  public hide(): void {
    this.visibleAnimate = false;
    setTimeout(() => this.visible = false, 300);
  }

  public onContainerClicked(event: MouseEvent): void {
    if ((<HTMLElement>event.target).classList.contains('modal')) {
      this.hide();
    }
  }
}

ในการแสดงฉากหลังคุณจะต้องมีอะไรเช่นนี้:

.modal {
  background: rgba(0,0,0,0.6);
}

ตัวอย่างในขณะนี้ช่วยให้การ Modals หลายอย่างในเวลาเดียวกัน (ดูonContainerClicked()วิธีการ)

สำหรับผู้ใช้ Bootstrap 4 cssคุณต้องทำการเปลี่ยนแปลงเล็กน้อย 1 รายการ (เนื่องจากชื่อคลาส css ได้รับการอัปเดตจาก Bootstrap 3) บรรทัดนี้: [ngClass]="{'in': visibleAnimate}"ควรเปลี่ยนเป็น: [ngClass]="{'show': visibleAnimate}"

เพื่อแสดงให้เห็นว่านี่คือเสียงแตก


มี gotcha แม้ว่า เนื่องจากมีการห่อปุ่มไว้ในองค์ประกอบพิเศษที่นี่สไตล์บู๊ตสแตรปจะไม่ใช้ระยะขอบกับปุ่ม (อย่างน้อยใน v4) การลบการตัดdiv.modal-footerและการเปลี่ยนแปลง.app-modal-footerที่จะ.modal-footerแก้ไขนี้
Axel Köhler

55

นี่เป็นตัวอย่างที่ดีงามของวิธีการที่คุณสามารถใช้กิริยาเงินทุนภายในแอป Angular2 บนGitHub

ส่วนสำคัญของมันคือคุณสามารถห่อ bootstrap html และการเริ่มต้น jquery ในองค์ประกอบ ฉันได้สร้างmodalส่วนประกอบที่นำกลับมาใช้ใหม่ที่ช่วยให้คุณสามารถเปิดการใช้ตัวแปรแม่แบบ

<button type="button" class="btn btn-default" (click)="modal.open()">Open me!</button>

<modal #modal>
    <modal-header [show-close]="true">
        <h4 class="modal-title">I'm a modal!</h4>
    </modal-header>
    <modal-body>
        Hello World!
    </modal-body>
    <modal-footer [show-default-buttons]="true"></modal-footer>
</modal>

คุณเพียงแค่ต้องติดตั้งแพ็กเกจ npm และลงทะเบียนโมดูล modal ในโมดูลแอปของคุณ:

import { Ng2Bs3ModalModule } from 'ng2-bs3-modal/ng2-bs3-modal';

@NgModule({
    imports: [Ng2Bs3ModalModule]
})
export class MyAppModule {}

8
Bummer - อาศัย jquery เป็นการพึ่งพา :(
brando

52
ใช่ bootstrap อาศัยมันและฉันไม่ได้อยู่ในธุรกิจของการเขียนไลบรารีใหม่
Douglas Ludlow

2
สามารถทำได้โดยไม่ต้อง jQuery ฉันใช้คำตอบของแซมพร้อมกับบทช่วยสอนที่koscielniak.me/post2016/03/angular2-confirm-dialog-componentเพื่อเขียนบริการและองค์ประกอบที่เกี่ยวข้อง
BeetleJuice

หากคุณไม่ได้ใช้ bootstrap ในโครงการอย่าลืมเพิ่มลิงค์ไปยัง bootstrap.css หน้า github ลืมพูดถึงสิ่งนี้
Shekhar

46

นี่เป็นวิธีการง่ายๆที่ไม่ได้ขึ้นอยู่กับ jquery หรือไลบรารี่อื่นใดนอกจาก Angular 2 สามารถใช้คอมโพเนนต์ด้านล่าง (errorMessage.ts) เป็นมุมมองย่อยของคอมโพเนนต์อื่นได้ มันเป็นเพียง modal bootstrap ที่เปิดหรือแสดงเสมอ การมองเห็นของมันจะถูกควบคุมโดยคำสั่ง ngIf

errorMessage.ts

import { Component } from '@angular/core';
@Component({
    selector: 'app-error-message',
    templateUrl: './app/common/errorMessage.html',
})
export class ErrorMessage
{
    private ErrorMsg: string;
    public ErrorMessageIsVisible: boolean;

    showErrorMessage(msg: string)
    {
        this.ErrorMsg = msg;
        this.ErrorMessageIsVisible = true;
    }

    hideErrorMsg()
    {
        this.ErrorMessageIsVisible = false;
    }
}

errorMessage.html

<div *ngIf="ErrorMessageIsVisible" class="modal fade show in danger" id="myModal" role="dialog">
    <div class="modal-dialog">

        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h4 class="modal-title">Error</h4>
            </div>
            <div class="modal-body">
                <p>{{ErrorMsg}}</p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" (click)="hideErrorMsg()">Close</button>
            </div>
        </div>
    </div>
</div>

นี่คือตัวอย่างการควบคุมหลัก (บางรหัสที่ไม่เกี่ยวข้องได้ถูกละเว้นเพื่อความกะทัดรัด):

parent.ts

import { Component, ViewChild } from '@angular/core';
import { NgForm } from '@angular/common';
import {Router, RouteSegment, OnActivate, ROUTER_DIRECTIVES } from '@angular/router';
import { OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';


@Component({
    selector: 'app-application-detail',
    templateUrl: './app/permissions/applicationDetail.html',
    directives: [ROUTER_DIRECTIVES, ErrorMessage]  // Note ErrorMessage is a directive
})
export class ApplicationDetail implements OnActivate
{
    @ViewChild(ErrorMessage) errorMsg: ErrorMessage;  // ErrorMessage is a ViewChild



    // yada yada


    onSubmit()
    {
        let result = this.permissionsService.SaveApplication(this.Application).subscribe(x =>
        {
            x.Error = true;
            x.Message = "This is a dummy error message";

            if (x.Error) {
                this.errorMsg.showErrorMessage(x.Message);
            }
            else {
                this.router.navigate(['/applicationsIndex']);
            }
        });
    }

}

parent.html

<app-error-message></app-error-message>
// your html...

3
ดี - สามารถอธิบายได้class="modal fade show in danger"
bensiu

@bensiu ฉันคาดเดาว่าจะไม่ใช้ตัวเลือกคลาส - หากไม่มีตัวเลือกสไตล์ css สำหรับคำเหล่านั้นทั้งหมดเช่น 'in'
Drenai

คุณจะได้รับผลจางหายเข้า / ออกด้วยวิธีนี้ได้อย่างไร
Big McLargeHuge

10

ตอนนี้มีให้เป็นแพ็คเกจ NPM

เชิงมุมกำหนดเองกิริยา


@ สตีเฟ่นต่อเนื่องพอล...

  • Bootstrap css เชิงมุม 2 ขึ้นไป (เก็บภาพเคลื่อนไหวไว้)
  • ไม่มี JQuery
  • ไม่มี bootstrap.js
  • รองรับเนื้อหากิริยาที่กำหนดเอง
  • สนับสนุนหลาย modals ที่ด้านบนของกันและกัน
  • Moduralized
  • ปิดใช้งานการเลื่อนเมื่อโมดอลเปิดอยู่
  • Modal จะถูกทำลายเมื่อไปทางอื่น
  • การเริ่มต้นเนื้อหาขี้เกียจซึ่งได้รับngOnDestroy(ed) เมื่อออกจาก modal
  • การเลื่อนพาเรนต์ถูกปิดใช้งานเมื่อมองเห็นโมดอล

การเริ่มต้นเนื้อหาขี้เกียจ

ทำไม?

ในบางกรณีคุณอาจไม่ต้องการที่จะเป็นกิริยาช่วยในการรักษาสถานะของมันหลังจากที่ถูกปิด แต่กลับคืนสู่สถานะเริ่มต้น

ปัญหา modal ดั้งเดิม

การส่งเนื้อหาตรงไปตรงมาสู่มุมมองจะสร้างการเริ่มต้นจริงก่อนที่ modal จะได้รับ Modal ไม่มีวิธีฆ่าเนื้อหาดังกล่าวแม้ว่าจะใช้*ngIfwrapper

สารละลาย

ng-template. ng-templateไม่แสดงจนกว่าจะสั่งให้ทำ

-component.module.ts ของฉัน

...
imports: [
  ...
  ModalModule
]

-component.ts ของฉัน

<button (click)="reuseModal.open()">Open</button>
<app-modal #reuseModal>
  <ng-template #header></ng-template>
  <ng-template #body>
    <app-my-body-component>
      <!-- This component will be created only when modal is visible and will be destroyed when it's not. -->
    </app-my-body-content>
    <ng-template #footer></ng-template>
</app-modal>

modal.component.ts

export class ModalComponent ... {
  @ContentChild('header') header: TemplateRef<any>;
  @ContentChild('body') body: TemplateRef<any>;
  @ContentChild('footer') footer: TemplateRef<any>;
 ...
}

modal.component.html

<div ... *ngIf="visible">
  ...
  <div class="modal-body">
    ng-container *ngTemplateOutlet="body"></ng-container>
  </div>

อ้างอิง

ฉันต้องบอกว่ามันคงเป็นไปไม่ได้หากไม่มีเอกสารที่เป็นทางการและชุมชนยอดเยี่ยมทั่วเน็ต มันอาจจะช่วยบางส่วนของคุณเกินไปที่จะทำความเข้าใจวิธีการng-template, *ngTemplateOutletและ@ContentChildการทำงาน

https://angular.io/api/common/NgTemplateOutlet
https://blog.angular-university.io/angular-ng-template-ng-container-ngtemplateoutlet/
https://medium.com/claritydesignsystem/ng-content -the-hidden-docs-96a29d70d11b
https://netbasal.com/understanding-viewchildren-contentchildren-and-querylist-in-angular-896b0c689f6e
https://netbasal.com/understanding-viewchildren-contentchildren-and-querylist-in-children-and-querylist-in-questlist -angular-896b0c689f6e

โซลูชั่นการคัดลอกวางแบบเต็ม

modal.component.html

<div
  (click)="onContainerClicked($event)"
  class="modal fade"
  tabindex="-1"
  [ngClass]="{'in': visibleAnimate}"
  [ngStyle]="{'display': visible ? 'block' : 'none', 'opacity': visibleAnimate ? 1 : 0}"
  *ngIf="visible">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <ng-container *ngTemplateOutlet="header"></ng-container>
        <button class="close" data-dismiss="modal" type="button" aria-label="Close" (click)="close()">×</button>
      </div>
      <div class="modal-body">
        <ng-container *ngTemplateOutlet="body"></ng-container>
      </div>
      <div class="modal-footer">
        <ng-container *ngTemplateOutlet="footer"></ng-container>
      </div>
    </div>
  </div>
</div>

modal.component.ts

/**
 * @Stephen Paul https://stackoverflow.com/a/40144809/2013580
 * @zurfyx https://stackoverflow.com/a/46949848/2013580
 */
import { Component, OnDestroy, ContentChild, TemplateRef } from '@angular/core';

@Component({
  selector: 'app-modal',
  templateUrl: 'modal.component.html',
  styleUrls: ['modal.component.scss'],
})
export class ModalComponent implements OnDestroy {
  @ContentChild('header') header: TemplateRef<any>;
  @ContentChild('body') body: TemplateRef<any>;
  @ContentChild('footer') footer: TemplateRef<any>;

  public visible = false;
  public visibleAnimate = false;

  ngOnDestroy() {
    // Prevent modal from not executing its closing actions if the user navigated away (for example,
    // through a link).
    this.close();
  }

  open(): void {
    document.body.style.overflow = 'hidden';

    this.visible = true;
    setTimeout(() => this.visibleAnimate = true, 200);
  }

  close(): void {
    document.body.style.overflow = 'auto';

    this.visibleAnimate = false;
    setTimeout(() => this.visible = false, 100);
  }

  onContainerClicked(event: MouseEvent): void {
    if ((<HTMLElement>event.target).classList.contains('modal')) {
      this.close();
    }
  }
}

modal.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { ModalComponent } from './modal.component';

@NgModule({
  imports: [
    CommonModule,
  ],
  exports: [ModalComponent],
  declarations: [ModalComponent],
  providers: [],
})
export class ModalModule { }

7

ฉันใช้ngx-bootstrapสำหรับโครงการของฉัน

คุณสามารถค้นหาตัวอย่างได้ที่นี่

GitHub อยู่ที่นี่

วิธีใช้:

  1. ติดตั้งngx-bootstrap

  2. นำเข้าสู่โมดูลของคุณ

// RECOMMENDED (doesn't work with system.js)
import { ModalModule } from 'ngx-bootstrap/modal';
// or
import { ModalModule } from 'ngx-bootstrap';

@NgModule({
  imports: [ModalModule.forRoot(),...]
})
export class AppModule(){}
  1. กิริยาคงที่ง่าย
<button type="button" class="btn btn-primary" (click)="staticModal.show()">Static modal</button>
<div class="modal fade" bsModal #staticModal="bs-modal" [config]="{backdrop: 'static'}"
tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
<div class="modal-dialog modal-sm">
   <div class="modal-content">
      <div class="modal-header">
         <h4 class="modal-title pull-left">Static modal</h4>
         <button type="button" class="close pull-right" aria-label="Close" (click)="staticModal.hide()">
         <span aria-hidden="true">&times;</span>
         </button>
      </div>
      <div class="modal-body">
         This is static modal, backdrop click will not close it.
         Click <b>&times;</b> to close modal.
      </div>
   </div>
</div>
</div>

4

นี่คือการใช้งานเต็มรูปแบบขององค์ประกอบ modal bootstrap angular2 ของฉัน:

ฉันคิดว่าในไฟล์ index.html หลักของคุณ (พร้อม<html>และ<body>แท็ก) ที่ด้านล่างของ<body>แท็กคุณมี:

  <script src="assets/js/jquery-2.1.1.js"></script>
  <script src="assets/js/bootstrap.min.js"></script>

modal.component.ts:

import { Component, Input, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core';

declare var $: any;// this is very importnant (to work this line: this.modalEl.modal('show')) - don't do this (becouse this owerride jQuery which was changed by bootstrap, included in main html-body template): let $ = require('../../../../../node_modules/jquery/dist/jquery.min.js');

@Component({
  selector: 'modal',
  templateUrl: './modal.html',
})
export class Modal implements AfterViewInit {

    @Input() title:string;
    @Input() showClose:boolean = true;
    @Output() onClose: EventEmitter<any> = new EventEmitter();

    modalEl = null;
    id: string = uniqueId('modal_');

    constructor(private _rootNode: ElementRef) {}

    open() {
        this.modalEl.modal('show');
    }

    close() {
        this.modalEl.modal('hide');
    }

    closeInternal() { // close modal when click on times button in up-right corner
        this.onClose.next(null); // emit event
        this.close();
    }

    ngAfterViewInit() {
        this.modalEl = $(this._rootNode.nativeElement).find('div.modal');
    }

    has(selector) {
        return $(this._rootNode.nativeElement).find(selector).length;
    }
}

let modal_id: number = 0;
export function uniqueId(prefix: string): string {
    return prefix + ++modal_id;
}

modal.html:

<div class="modal inmodal fade" id="{{modal_id}}" tabindex="-1" role="dialog"  aria-hidden="true" #thisModal>
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header" [ngClass]="{'hide': !(has('mhead') || title) }">
                <button *ngIf="showClose" type="button" class="close" (click)="closeInternal()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
                <ng-content select="mhead"></ng-content>
                <h4 *ngIf='title' class="modal-title">{{ title }}</h4>
            </div>
            <div class="modal-body">
                <ng-content></ng-content>
            </div>

            <div class="modal-footer" [ngClass]="{'hide': !has('mfoot') }" >
                <ng-content select="mfoot"></ng-content>
            </div>
        </div>
    </div>
</div>

และตัวอย่างการใช้งานในไคลเอนต์ Editor ส่วนประกอบ: client-edit-component.ts:

import { Component } from '@angular/core';
import { ClientService } from './client.service';
import { Modal } from '../common';

@Component({
  selector: 'client-edit',
  directives: [ Modal ],
  templateUrl: './client-edit.html',
  providers: [ ClientService ]
})
export class ClientEdit {

    _modal = null;

    constructor(private _ClientService: ClientService) {}

    bindModal(modal) {this._modal=modal;}

    open(client) {
        this._modal.open();
        console.log({client});
    }

    close() {
        this._modal.close();
    }

}

ลูกค้า edit.html:

<modal [title]='"Some standard title"' [showClose]='true' (onClose)="close()" #editModal>{{ bindModal(editModal) }}
    <mhead>Som non-standart title</mhead>
    Some contents
    <mfoot><button calss='btn' (click)="close()">Close</button></mfoot>
</modal>

ofcourse title, showClose, <mhead>และ<mfoot>AR ตัวเลือกพารามิเตอร์ / แท็ก


2
แทนที่จะbindModal(modal) {this._modal=modal;}คุณสามารถใช้มุมของคำอธิบายประกอบเช่นดังนั้น:ViewChild @ViewChild('editModal') _modal: Modal;มันจัดการการผูกสำหรับคุณที่อยู่เบื้องหลัง
Douglas Ludlow

2

ตรวจสอบกล่องโต้ตอบ ASUI ที่สร้างเมื่อรันไทม์ ไม่จำเป็นต้องซ่อนและแสดงตรรกะ บริการเพียงแค่จะสร้างองค์ประกอบที่รันไทม์โดยใช้ AOT ASUI NPM


สวัสดี Aravind Sivam โปรดอ่าน: stackoverflow.com/help/promotion
Pang

0

ลองใช้ ng-window มันอนุญาตให้นักพัฒนาเปิดและควบคุมหน้าต่างหลายบานในแอพพลิเคชั่นหน้าเดียวด้วยวิธีง่าย ๆ ไม่ต้องใช้ jquery ไม่มีบูตสแตรป

ป้อนคำอธิบายรูปภาพที่นี่

Avilable Configration

  • ขยายขนาดหน้าต่าง
  • ย่อเล็กสุดหน้าต่าง
  • ขนาดที่กำหนดเอง,
  • ตำแหน่งที่กำหนดเอง
  • หน้าต่างสามารถลากได้
  • บล็อกหน้าต่างหลักหรือไม่
  • จัดกึ่งกลางหน้าต่างหรือไม่
  • ส่งค่าไปยังหน้าต่างการไล่ล่า
  • ส่งผ่านค่าจากหน้าต่าง chield ไปยังหน้าต่างหลัก
  • การฟังเพื่อปิดหน้าต่างการไล่ล่าในหน้าต่างหลัก
  • ฟังเพื่อปรับขนาดกิจกรรมด้วยฟังของคุณเอง
  • เปิดด้วยขนาดสูงสุดหรือไม่
  • เปิดใช้งานและปิดใช้งานการปรับขนาดหน้าต่าง
  • เปิดใช้งานและปิดการใช้งานการขยายใหญ่สุด
  • เปิดใช้งานและปิดการใช้งานย่อเล็กสุด

-1 มันมีประโยชน์อย่างไรบ้าง? ไม่ได้ระบุถึงข้อกำหนดใด ๆ ตามที่ OP กำหนด นี่คือโพสต์ที่ 4 ที่ฉันเห็นคุณหมุนรอบคำตอบของคุณ!
avn

0

เชิงมุม 7 + NgBootstrap

วิธีง่ายๆในการเปิด modal จากองค์ประกอบหลักและส่งผ่านผลลัพธ์กลับไปที่มัน คือสิ่งที่ฉันต้องการ ฉันสร้างแบบฝึกหัดทีละขั้นตอนซึ่งรวมถึงการสร้างโครงการใหม่ตั้งแต่เริ่มต้นการติดตั้ง ngbootstrap และการสร้าง Modal คุณสามารถคัดลอกหรือทำตามคำแนะนำ

หวังว่านี่จะช่วยใหม่สำหรับ Angular!

https://github.com/wkaczurba/modal-demo

รายละเอียด:

แม่แบบง่าย ๆ (modal-simple.component.html):

<ng-template #content let-modal>
  <div class="modal-header">
    <h4 class="modal-title" id="modal-basic-title">Are you sure?</h4>
    <button type="button" class="close" aria-label="Close" (click)="modal.dismiss('Cross click')">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
  <div class="modal-body">
    <p>You have not finished reading my code. Are you sure you want to close?</p>
  </div>
  <div class="modal-footer">
    <button type="button" class="btn btn-outline-dark" (click)="modal.close('yes')">Yes</button>
    <button type="button" class="btn btn-outline-dark" (click)="modal.close('no')">No</button>
  </div>
</ng-template>

The modal-simple.component.ts:

import { Component, OnInit, ViewChild, Output, EventEmitter } from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';

@Component({
  selector: 'app-modal-simple',
  templateUrl: './modal-simple.component.html',
  styleUrls: ['./modal-simple.component.css']
})
export class ModalSimpleComponent implements OnInit {
  @ViewChild('content') content;
  @Output() result : EventEmitter<string> = new EventEmitter();

  constructor(private modalService : NgbModal) { }

  open() {
    this.modalService.open(this.content, {ariaLabelledBy: 'modal-simple-title'})
      .result.then((result) => { console.log(result as string); this.result.emit(result) }, 
        (reason) => { console.log(reason as string); this.result.emit(reason) })
  }

  ngOnInit() {
  }

}

ตัวอย่างของมัน (app.component.html) - วิธีง่ายๆในการจัดการกับเหตุการณ์ส่งคืน:

<app-modal-simple #mymodal (result)="onModalClose($event)"></app-modal-simple>
<button (click)="mymodal.open()">Open modal</button>

<p>
Result is {{ modalCloseResult }}
</p>

app.component.ts - onModalClosed ดำเนินการเมื่อ modal ถูกปิด:

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  modalCloseResult : string;
  title = 'modal-demo';

  onModalClose(reason : string) {
    this.modalCloseResult = reason;
  }    
}

ไชโย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.