Skip to content

Commit 0054f59

Browse files
authored
perf(module:tree-view): do not run change detection on click events if the nz-tree-node-option is disabled or there are no nzClick listeners (#7178)
1 parent 95c7816 commit 0054f59

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

components/tree-view/option.ts

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@
66
import {
77
ChangeDetectionStrategy,
88
Component,
9+
ElementRef,
910
EventEmitter,
1011
Input,
12+
NgZone,
1113
OnChanges,
14+
OnInit,
1215
Output,
1316
SimpleChanges
1417
} from '@angular/core';
18+
import { fromEvent } from 'rxjs';
19+
import { filter, takeUntil } from 'rxjs/operators';
1520

21+
import { NzDestroyService } from 'ng-zorro-antd/core/services';
1622
import { BooleanInput } from 'ng-zorro-antd/core/types';
1723
import { InputBoolean } from 'ng-zorro-antd/core/util';
1824

@@ -25,30 +31,29 @@ import { NzTreeNodeComponent } from './node';
2531
host: {
2632
class: 'ant-tree-node-content-wrapper',
2733
'[class.ant-tree-node-content-wrapper-open]': 'isExpanded',
28-
'[class.ant-tree-node-selected]': 'nzSelected',
29-
'(click)': 'onClick($event)'
30-
}
34+
'[class.ant-tree-node-selected]': 'nzSelected'
35+
},
36+
providers: [NzDestroyService]
3137
})
32-
export class NzTreeNodeOptionComponent<T> implements OnChanges {
38+
export class NzTreeNodeOptionComponent<T> implements OnChanges, OnInit {
3339
static ngAcceptInputType_nzSelected: BooleanInput;
3440
static ngAcceptInputType_nzDisabled: BooleanInput;
3541

3642
@Input() @InputBoolean() nzSelected = false;
3743
@Input() @InputBoolean() nzDisabled = false;
3844
@Output() readonly nzClick = new EventEmitter<MouseEvent>();
3945

40-
constructor(private treeNode: NzTreeNodeComponent<T>) {}
46+
constructor(
47+
private ngZone: NgZone,
48+
private host: ElementRef<HTMLElement>,
49+
private destroy$: NzDestroyService,
50+
private treeNode: NzTreeNodeComponent<T>
51+
) {}
4152

4253
get isExpanded(): boolean {
4354
return this.treeNode.isExpanded;
4455
}
4556

46-
onClick(e: MouseEvent): void {
47-
if (!this.nzDisabled) {
48-
this.nzClick.emit(e);
49-
}
50-
}
51-
5257
ngOnChanges(changes: SimpleChanges): void {
5358
const { nzDisabled, nzSelected } = changes;
5459
if (nzDisabled) {
@@ -67,4 +72,17 @@ export class NzTreeNodeOptionComponent<T> implements OnChanges {
6772
}
6873
}
6974
}
75+
76+
ngOnInit(): void {
77+
this.ngZone.runOutsideAngular(() =>
78+
fromEvent<MouseEvent>(this.host.nativeElement, 'click')
79+
.pipe(
80+
filter(() => !this.nzDisabled && this.nzClick.observers.length > 0),
81+
takeUntil(this.destroy$)
82+
)
83+
.subscribe(event => {
84+
this.ngZone.run(() => this.nzClick.emit(event));
85+
})
86+
);
87+
}
7088
}

0 commit comments

Comments
 (0)