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">×</span>
</button>
</div>
<div class="modal-body">
This is a modal.
</div>
</ng-template>
我正在尝试从父组件打开 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">×</span>
</button>
</div>
<div class="modal-body">
This is a modal.
</div>
</ng-template>