angular2:从父组件打开 ng2-bootstrap 模态

angular2 : open ng2-bootstrap modal from parent component

我正在尝试从父组件打开 ng2-bootstrap 模式。我创建了一个 ModalComponent 并且 "exportAs: child"。我的 ModalComponent 看起来像

import { Component, Input, ViewChild } from '@angular/core';
import { ModalDirective } from 'ng2-bootstrap/ng2-bootstrap';

@Component({
    selector: 'modal',
    moduleId: module.id,
    templateUrl: 'modal.component.html',
    styleUrls: ['modal.component.css'],
    exportAs: 'child'
})
export class ModalComponent {

    @ViewChild('childModal') public childModal:ModalDirective;

    public show( variant ):void {

        console.log( this.childModal );
        this.childModal.show();
    }

    public hide():void {

        this.childModal.hide();
    }
}

并且我将模态包含在父模板中作为

<modal #c="child"></modal>

... 并从父模板中将其调用为

<button type="button" class="btn btn-primary" (click)="c.show(variant)">open</button>

我正确地点击了 ModalComponent 中的 "show" 方法,但是 "childModal" 的值始终未定义(注意:console.log() 语句)。

非常感谢任何指点。

在我看来,要求您遍历组件和查询模态实例的模态 API 远非最佳。一种更好的方法是将模态作为服务。通过这种方式,您可以从代码的任何位置(包括服务,例如:登录服务)在模态上调用 open 方法。

这正是模态的 API 在 https://ng-bootstrap.github.io/#/components/modal 中被建模为服务的原因。通过使用它,您可以通过简单地执行 modalService.open(....).

任何 地方调用模态

顺便说一句,基于服务的模态方法也存在于其他 Angular2 小部件库中(例如 material 设计)。

简而言之:重新考虑您正在使用的 APIs。

在@yurzui 的帮助下,我意识到我的错误在 HTML。我将我的模态定义为

<div bsModal #smModal="bs-modal"...

Nb: "smModal" 需要重写为

<div bsModal #childModal="bs-modal"...

...瞧! "childModal" 不再是未定义的。

试试这个

component.ts 文件应该如下

import { Component, TemplateRef } from '@angular/core';
import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal';
 
@Component({
  selector: 'demo-modal-service-static',
  templateUrl: './service-template.html'
})
export class DemoModalServiceStaticComponent {
  modalRef: BsModalRef;
  constructor(private modalService: BsModalService) {}
 
  openModal(template: TemplateRef<any>) {
    this.modalRef = this.modalService.show(template);
  }
}

html应该是

<button type="button" class="btn btn-primary" (click)="openModal(template)">Create template modal</button>
 
<ng-template #template>
  <div class="modal-header">
    <h4 class="modal-title pull-left">Modal</h4>
    <button type="button" class="close pull-right" aria-label="Close" (click)="modalRef.hide()">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
  <div class="modal-body">
    This is a modal.
  </div>
</ng-template>