我正在尝试从父组件打开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()语句)。
非常感谢任何指针。
答案 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">×</span>
</button>
</div>
<div class="modal-body">
This is a modal.
</div>
</ng-template>