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

时间:2016-09-20 11:59:20

标签: angular ng2-bootstrap

我正在尝试从父组件打开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”的值总是未定义的(Nb:console.log()语句)。

非常感谢任何指针。

3 个答案:

答案 0 :(得分:2)

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

这就是为什么模态API在https://ng-bootstrap.github.io/#/components/modal中被建模为服务的原因。通过使用它,您只需执行{{1}}即可从任何位置调用模态。

BTW,基于服务的模态方法也存在于其他Angular2小部件库中(例如,材料设计)。

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

答案 1 :(得分:1)

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

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

Nb:&#34; smModal&#34;需要重写为

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

......瞧! &#34; childModal&#34;不再是未定义的。

答案 2 :(得分:0)

尝试一下

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>