Hiện có sẵn dưới dạng gói NPM
góc-tùy chỉnh-phương thức
@Stephen Paul tiếp tục ...
- Angular 2 trở lên Bootstrap css (hoạt hình được bảo tồn)
- KHÔNG JQuery
- KHÔNG bootstrap.js
- Hỗ trợ nội dung phương thức tùy chỉnh
- Hỗ trợ cho nhiều phương thức trên đầu nhau.
- Điều chế
- Vô hiệu hóa cuộn khi chế độ được mở
- Modal bị phá hủy khi điều hướng đi.
- Khởi tạo nội dung lười biếng, được
ngOnDestroy
(ed) khi phương thức được thoát.
- Cuộn cha mẹ bị vô hiệu hóa khi chế độ hiển thị
Khởi tạo nội dung lười biếng
Tại sao?
Trong một số trường hợp, bạn có thể không muốn phương thức giữ lại trạng thái của nó sau khi đã bị đóng, nhưng được khôi phục về trạng thái ban đầu.
Vấn đề phương thức gốc
Truyền nội dung đơn giản vào chế độ xem thực sự tạo ra khởi tạo nó ngay cả trước khi phương thức có được nó. Phương thức không có cách nào để giết nội dung đó ngay cả khi sử dụng *ngIf
trình bao bọc.
Giải pháp
ng-template
. ng-template
không kết xuất cho đến khi được yêu cầu làm như vậy.
my-thành phần.module.ts
...
imports: [
...
ModalModule
]
thành phần của tôi
<button (click)="reuseModal.open()">Open</button>
<app-modal #reuseModal>
<ng-template #header></ng-template>
<ng-template #body>
<app-my-body-component>
<!-- This component will be created only when modal is visible and will be destroyed when it's not. -->
</app-my-body-content>
<ng-template #footer></ng-template>
</app-modal>
modal.component.ts
export class ModalComponent ... {
@ContentChild('header') header: TemplateRef<any>;
@ContentChild('body') body: TemplateRef<any>;
@ContentChild('footer') footer: TemplateRef<any>;
...
}
modal.component.html
<div ... *ngIf="visible">
...
<div class="modal-body">
ng-container *ngTemplateOutlet="body"></ng-container>
</div>
Người giới thiệu
Tôi phải nói rằng điều đó sẽ không thể xảy ra nếu không có tài liệu chính thức và cộng đồng tuyệt vời trên mạng. Nó có thể giúp một số bạn quá để hiểu làm thế nào tốt hơn ng-template
, *ngTemplateOutlet
và @ContentChild
công việc.
https://angular.io/api/common/NgTemplateOutlet
https://blog.angular-university.io/angular-ng-template-ng-container-ngtemplateoutlet/
https://medium.com/claritydesignsystem/ng-content -the-ẩn-docs-96a29d70d11b
https://netbasal.com/understanding-viewchildren-contentchildren-and-querylist-in-angular-896b0c689f6e
https://netbasal.com/understanding-viewchildren-contentchildren-and-querylist-in -angular-896b0c689f6e
Giải pháp sao chép toàn bộ
modal.component.html
<div
(click)="onContainerClicked($event)"
class="modal fade"
tabindex="-1"
[ngClass]="{'in': visibleAnimate}"
[ngStyle]="{'display': visible ? 'block' : 'none', 'opacity': visibleAnimate ? 1 : 0}"
*ngIf="visible">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<ng-container *ngTemplateOutlet="header"></ng-container>
<button class="close" data-dismiss="modal" type="button" aria-label="Close" (click)="close()">×</button>
</div>
<div class="modal-body">
<ng-container *ngTemplateOutlet="body"></ng-container>
</div>
<div class="modal-footer">
<ng-container *ngTemplateOutlet="footer"></ng-container>
</div>
</div>
</div>
</div>
modal.component.ts
/**
* @Stephen Paul https://stackoverflow.com/a/40144809/2013580
* @zurfyx https://stackoverflow.com/a/46949848/2013580
*/
import { Component, OnDestroy, ContentChild, TemplateRef } from '@angular/core';
@Component({
selector: 'app-modal',
templateUrl: 'modal.component.html',
styleUrls: ['modal.component.scss'],
})
export class ModalComponent implements OnDestroy {
@ContentChild('header') header: TemplateRef<any>;
@ContentChild('body') body: TemplateRef<any>;
@ContentChild('footer') footer: TemplateRef<any>;
public visible = false;
public visibleAnimate = false;
ngOnDestroy() {
// Prevent modal from not executing its closing actions if the user navigated away (for example,
// through a link).
this.close();
}
open(): void {
document.body.style.overflow = 'hidden';
this.visible = true;
setTimeout(() => this.visibleAnimate = true, 200);
}
close(): void {
document.body.style.overflow = 'auto';
this.visibleAnimate = false;
setTimeout(() => this.visible = false, 100);
}
onContainerClicked(event: MouseEvent): void {
if ((<HTMLElement>event.target).classList.contains('modal')) {
this.close();
}
}
}
modal.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ModalComponent } from './modal.component';
@NgModule({
imports: [
CommonModule,
],
exports: [ModalComponent],
declarations: [ModalComponent],
providers: [],
})
export class ModalModule { }