2

我正在尝试从父组件打开 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() 语句)。

非常感谢任何指针。

4

3 回答 3

2

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

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

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

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

于 2016-09-20T12:14:45.700 回答
1

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

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

Nb:“smModal”需要重写为

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

……瞧!“childModal”不再是未定义的。

于 2016-09-20T12:55:58.183 回答
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>
于 2020-11-08T15:18:00.707 回答