【发布时间】:2017-11-05 17:45:32
【问题描述】:
在编程时,可重用性非常重要,我们可以做任何减少代码重复的事情。
我必须在我的 Angular 2 项目中的许多地方使用模态弹出窗口向用户显示信息。我正在使用ng-bootstrap,所有这些模态框都具有相同的页眉和页脚,但在许多情况下正文会发生变化。有时,body 只是想替换一个占位符,而在其他时候,准备动态内容有一些复杂性。这些由不同的组件触发或管理。
ng-bootstrap 允许我们以两种方式将内容传递到 Modal。
- 作为模板。这里将整个 Modal html 包装在
<ng-template></ng-template> - 作为一个组件
使用第一种方法,我必须为每个模式重复编写页眉、正文和页脚。
使用第二种方法,我可以将 HTML 包装在一个组件中,但需要放置占位符以使其动态化。那么我可以按如下方式传递值
open() {
const modalRef = this.modalService.open(NgbdModalContent);
modalRef.componentInstance.name = 'World';
}
但灵活性仍然有限。
我想要实现的是使用 Content Projection [Transclusion] 制作一个重用的模态组件
所以,在我的 Common Modal 的主体中如下所示。我将<ng-content></ng-content> 作为Modal 主体的插槽。
@Component({
selector: 'common-modal',
template: `
<!-- Modal -->
<div class="modal fade" id="common-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">{{title}}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<ng-content></ng-content>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
`,
现在我希望我能像下面这样使用它。
<common-modal title="First Modal">
<span>Welcome Jasnan!</span>
</common-modal>
在其他地方
<common-modal title="Second Modal">
//......
<tr *ngFor="let student of pagedStudents">
<td>
{{student.name}}
</td>
<td>
{{student.grade}}
</td>
</tr>
//......
</common-modal>
我怎样才能做到这一点? ng-bootstrap 有没有办法做到这一点?感谢您帮助我解决这个问题。
【问题讨论】:
-
我的回答 (stackoverflow.com/a/44430342/2335675) 能回答您的问题吗?
-
到目前为止,您所看到的一切都非常好。这个实现有什么问题?你试过这个吗?
-
您不能使用@input 值将输入传递给您的模态吗?
-
你有没有找到一个好的解决方案。我正在尝试做同样的事情。我的问题是让主按钮工作。所有逻辑都在模态组件中,但按钮在基本模态组件中。
-
@IanHoar 希望下面的答案将来有时会对您有所帮助
标签: angular ng-bootstrap