44

我有一个模态:

<template #warningModal let-c="close" let-d="dismiss">
  <div class="modal-header">
    <button type="button" class="close" aria-label="Close" (click)="d('Cross click')">
      <span aria-hidden="true">&times;</span>
    </button>
    <h4 class="modal-title">Warning</h4>
  </div>
  <div class="modal-body">
      The numbers you have entered result in negative expenses.  We will treat this as $0.00.  Do you want to continue?
  </div>
  <div class="modal-footer">
    <button type="button" class="btn btn-secondary" (click)="c('Close click')">No</button>
    <button type="button" class="btn btn-secondary" (click)="submit()">Yes</button>
  </div>
</template>

每当我单击“是”时,我希望它调用一个函数并自行关闭。
在我的控制器中,我有@ViewChild('warningModal') warning;并且在 中submit(),我有this.warning.close();,但是this.warning.close is not a function每当我单击是时都会得到。

我如何让它按照我想要的方式工作?

4

9 回答 9

96

为了解释 pkozlowski.opensource 的响应,我实际上获得对 NgbModalRef 类的引用的方式是修改他在 this.modalService.open 上的 plunker 中的内容,如下所示:

this.modalReference = this.modalService.open(content);
this.modalReference.result.then((result) => {
  this.closeResult = `Closed with: ${result}`;
}, (reason) => {
  this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});

然后我可以打电话:

this.modalReference.close();

这就像一个魅力。哦,别忘了把定义 modalReference 放在类的顶部:

modalReference: any;
于 2017-05-30T18:30:00.670 回答
22

如果您使用https://ng-bootstrap.github.io/(如您的问题所示),事情非常简单 - 您可以打开一个模式并从模板(如您的代码中)以编程方式关闭它(通过调用close()返回的对象类型的方法NgbModalRef)。

这是一个显示此操作的最小示例: http ://plnkr.co/edit/r7watmQuyaUQ8onY17Z1?p=preview

您可能会混淆不同的库,或者您的问题可能还有更多问题,但仅根据提供的信息很难说更多。

于 2016-11-02T14:48:31.613 回答
17

与 TBrenner 不同,我不能只使用modalReference: any;

我运行:

    "@ng-bootstrap/ng-bootstrap": "^1.0.0-beta.9",
    with angular 5

我必须在我的 app.module.ts 中导入

import { NgbModal } from '@ng-bootstrap/ng-bootstrap';

当然也可以将其添加到提供者中:

providers[ NgbModal]

一旦在这里完成,就是模态组件的代码:

 import { Component, Input } from '@angular/core'; 
 import { ModalDismissReasons, NgbModal, NgbModalRef } from '@ng 
 bootstrap/ng-bootstrap';

export class MyClass {
modalReference: NgbModalRef;

constructor(private modalService: NgbModal)
open(content) {
this.modalReference = this.modalService.open(content);
this.modalReference.result.then((result) => {
  this.closeResult = `Closed with: ${result}`;
}, (reason) => {
  this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});
}

private getDismissReason(reason: any): string {
if (reason === ModalDismissReasons.ESC) {
  return 'by pressing ESC';
} else if (reason === ModalDismissReasons.BACKDROP_CLICK) {
  return 'by clicking on a backdrop';
} else {
  return `with: ${reason}`;
}
}

JoinAndClose() {
this.modalReference.close();
}

https://ng-bootstrap.github.io应该添加一些关于参考重要性的信息。我有点努力理解我需要创建一个参考来访问“.close()”方法。谢谢大家,帮了大忙!

于 2018-03-03T18:47:20.747 回答
14

您可以通过以下方式简单地关闭模式。

首先当我们打开 Modal

this.modalService.open(content, { size: "lg" }).result.then(
      result => {
        this.closeResult = `Closed with: ${result}`;
      },
      reason => {
        this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
      }

在 TS 之后用于关闭使用此

 this.modalService.dismissAll();
于 2019-03-12T09:37:41.463 回答
7

打开模态

import { NgbModal } from '@ng-bootstrap/ng-bootstrap';

modalReference = null;     

constructor(private modalService: NgbModal) {

   }

openVerticallyCentered(content) {
    this.modalReference = this.modalService.open(content, { centered: true });
  }

使用参考关闭模态,就像阿米特说的

this.modalReference.close();

来源:https ://ng-bootstrap.github.io/#/components/modal/examples

于 2018-08-14T15:55:11.650 回答
2

你有let-dlet-c作为<template #warningModal let-c="close" let-d="dismiss">变量,两者都是函数。因此,简单的方法是:传入cd传入提交作为这样的参数,(click)="submit(c)"或者(click)="submit(d)"然后在函数中调用submit(c){ c('close modal'); }. 希望这对你有用。

于 2018-09-29T15:08:22.457 回答
1

在我看来:模态负责关闭自己而不是模态的调用者。

模态可以简单地NgbActiveModal通过注入器访问类,并通过调用关闭或关闭函数来关闭自己。

import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';

export class Modal {

    constructor(private activeModal: NgbActiveModal) {
    }

    public submit() {
        this.activeModal.close(/* your result */);
    }

    public close() {
        this.activeModal.close();
    }

}
于 2020-10-05T08:20:33.953 回答
1

您所做的@ViewChild('warningModal') warning是让TemplateRef您在模态中使用,而不是实际的NgbModalRef.

这取决于你如何打开你的模式,如果你以编程方式打开它,你应该收到NgbModalRef你可以调用的对象.close

于 2016-11-02T14:56:58.517 回答
0

有一种从集中式应用程序组件级别执行此操作的 hacky 方法

this._platformLocation.onPopState(() => {
        document.getElementsByClassName('modal-header')[0].getElementsByTagName('a')[0].click();
    });

这应该放在 app.component.ts 文件的构造函数中。

于 2021-07-22T14:49:52.220 回答