Giả sử tôi có một function noificationHandler()
trong dịch vụ của tôi.ts nằm ngoài ngữ cảnh của góc cạnh. noificationHandler()
được gọi bởi bên thứ ba và noificationHandler()
về cơ bản tiêu thụ một mảng và phát ra mảng cho các thành phần đã đăng ký dịch vụ của mình.Angular2 zone.run() vs ChangeDetectorRef.detectChanges()
service.ts
public mySubject: Subject<any> = new Subject();
public myObservable = this.mySubject.asObservable();
constructor() {
this.registry.subscribe("notification.msg",this.noificationHandler.bind(this));
}
noificationHandler(data) {
this.publishUpdate(data)
}
publishUpdate(data) {
this.mySubject.next(data);
}
component.ts
constructor(private service: myService) {
this.service.myObservable.subscribe(list => {
this.list = list;
});
}
^^^ vào thời điểm này các mẫu không được cập nhật với các dữ liệu mới
Kể từ khi "notification.msg"
nằm ngoài khu vực của góc, góc cạnh s ch phát hiện ange không được chạy khi sự kiện này ("notification.msg")
được gọi.
Bây giờ có 2 cách để gọi phát hiện thay đổi.
1) Bằng cách gói các noificationHandler()
bên trong zone.run góc của()
this.registry.subscribe("a2mevent.notification.msg", this.ngZone.run(() => this.noificationHandler.bind(this)));
2) Bằng cách cá nhân yêu cầu thành phần để phát hiện những thay đổi
constructor(private service: myService, private ref: ChangeDetectorRef) {
this.service.myObservable.subscribe(list => {
this.list = list;
this.ref.detectChanges(); // <==== manually invoking change detection
});
}
Cả hai tùy chọn làm việc! Và cấu trúc thành phần của tôi là như sau
A --> root component
B
C
D // my component is here (4 levels of nesting)
Câu hỏi -
1) Sẽ detectChanges() phát hiện những thay đổi duy nhất cho các thành phần riêng của mình hoặc sẽ nó cũng chạy phát hiện sự thay đổi về thành phần con?
2) sẽ zone.run() kích hoạt phát hiện thay đổi của tất cả các thành phần từ gốc đến lá?
Trong số các zone.run() và detectChanges() Tôi tò mò muốn làm gì tốt hơn trong hiệu suất ?