+ ContentChildren sẽ được init trước khi lifecycle ngAfterContentInit được call, đây là thời điểm để thao tác
+ Lắng nghe changes để update
Note:: Khái niệm giữa view và content
View:: là những cái như html, css
Content:: là những phần được truyền từ bên ngoài vào component
-> nó là <ng-content> hứng toàn bộ phần view từ ngoài
Ex: Dùng đơn giản:: <app><div>a</div></app> -> <ng-content></ng-content>
—————————————————————————————————————
✅Sử dụng @ViewChild/@ViewChildren
Using viewChild with DOM Elements
+ ViewChild giúp truy cập các phần tử DOM gốc có biến tham chiếu mẫu
<input #tempInput class=“” />
@ViewChild(‘tempInput’) inputEl: ElementRef
_> nếu là 1 tag div hay muốn lấy 1 tập hợp template::
<div #card>blala…</div>
@ViewChild(‘card’) card: TemplateRef<any>;
Using ViewChild with Child Components
+ Tạo component
+ Tại thằng cha sử dụng component thì định nghĩa 1 variable::
@ViewChild(AbcComponent) abc: AbcComponent;
ngAfterViewInit(){
console.log(this.abc.fn());
}
—————————————————————————————————————
✅Khi ở trong form, không nên gọi hàm từ attribute trả về
Ex: [disabled]="isInvalidData()"
=> Mỗi lần trên form nhận action thì attribute sẽ trigger vào hàm để checking
—————————————————————————————————————
Dấu chấm than (!) trong typescript có nghĩa là::
~> Báo với typescript rằng biến này sẽ được gán 1 giá trị, do vậy ko cần báo lỗi
—————————————————————————————————————
List dùng với map(fn(data: IData))
this.list.map(fnMap(data)); //fnMap trả về giá trị cho object list
export const fnMap =(data: IData) => (dataForMap: IData) => {return {…dataForMap, variableAdd: value}}; //Thực hiện nhận vào data và trả về object list.
—————————————————————————————————————
✅Xử lý nhận ng-content
<ng-content select="[errors]"></ng-content>
Bên ngoài truyền vào chỉ điểm ->
<wrapper>
<ng-container [ngSwitch]="getAmountError" errors>
</wrapper>
—————————————————————————————————————
✅ Memory leak {A}
~ Do cách code (lý do duy nhất để xảy ra memory leak)
~ Xảy ra với những operators (không bao giờ complete)::