Trên thực tế, có hai cách để phát hiện và hành động khi một đầu vào thay đổi trong thành phần con trong angular2 +:
- Bạn có thể sử dụng phương pháp vòng đời ngOnChanges () như được đề cập trong các câu trả lời cũ hơn:
@Input() categoryId: string;
ngOnChanges(changes: SimpleChanges) {
this.doSomething(changes.categoryId.currentValue);
// You can also use categoryId.previousValue and
// categoryId.firstChange for comparing old and new values
}
Liên kết tài liệu: ngOnChanges, SimpleChanges, SimpleChange
Demo Ví dụ: Nhìn vào plunker này
- Thay phiên, bạn cũng có thể sử dụng trình thiết lập thuộc tính đầu vào như sau:
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
Liên kết tài liệu: Nhìn vào đây .
Ví dụ demo: Nhìn vào plunker này .
TIẾP CẬN NÀO BẠN NÊN SỬ DỤNG?
Nếu thành phần của bạn có một vài đầu vào, thì, nếu bạn sử dụng ngOnChanges (), bạn sẽ nhận được tất cả các thay đổi cho tất cả các đầu vào cùng một lúc trong ngOnChanges (). Sử dụng phương pháp này, bạn cũng có thể so sánh các giá trị hiện tại và trước đây của đầu vào đã thay đổi và thực hiện các hành động tương ứng.
Tuy nhiên, nếu bạn muốn làm gì đó khi chỉ một đầu vào cụ thể thay đổi (và bạn không quan tâm đến các đầu vào khác), thì có thể đơn giản hơn khi sử dụng trình thiết lập thuộc tính đầu vào. Tuy nhiên, cách tiếp cận này không cung cấp cách xây dựng để so sánh các giá trị trước đây và hiện tại của đầu vào đã thay đổi (mà bạn có thể thực hiện dễ dàng với phương pháp vòng đời ngOnChanges).
EDIT 2017-07-25: PHÁT HIỆN THAY ĐỔI ANGULAR CÓ THỂ VẪN CHƯA TỪNG HIỂU MỘT SỐ CIRCUMSTANCES
Thông thường, phát hiện thay đổi cho cả setter và ngOnChanges sẽ kích hoạt bất cứ khi nào thành phần cha mẹ thay đổi dữ liệu mà nó truyền cho con, với điều kiện dữ liệu là kiểu dữ liệu nguyên thủy của JS (chuỗi, số, boolean) . Tuy nhiên, trong các trường hợp sau, nó sẽ không kích hoạt và bạn phải thực hiện thêm các hành động để làm cho nó hoạt động.
Nếu bạn đang sử dụng một đối tượng hoặc mảng lồng nhau (thay vì kiểu dữ liệu nguyên thủy JS) để truyền dữ liệu từ Parent sang Child, phát hiện thay đổi (sử dụng setter hoặc ngchanges) có thể không được kích hoạt, như người dùng đã đề cập trong câu trả lời: muetzerich. Đối với các giải pháp xem ở đây .
Nếu bạn đang thay đổi dữ liệu bên ngoài bối cảnh góc (tức là bên ngoài), thì góc sẽ không biết về những thay đổi. Bạn có thể phải sử dụng ChangeDetectorRef hoặc NgZone trong thành phần của mình để nhận biết các thay đổi bên ngoài và do đó kích hoạt phát hiện thay đổi. Tham khảo điều này .