通过查看在中实现更改检测的方式,如果已分离AsyncPipe
,似乎this._ref.markForCheck()
不会运行(此处ChangeDetectorRef
也已确认)。
这样做的动机是完全控制何时发生更改检测(通过Observable
专门使用类似 MVVM 模式)。我正在使用一个对性能非常敏感的代码,我可以完全控制输入,但使用ChangeDetectionStrategy.OnPush
触发更改检测不仅用于输入更改,还控制事件触发(如点击事件),这会通过重新运行不需要的更改检测来大大降低性能每次点击都扫一扫。
所以我选择ChangeDetectorRef
完全分离,但现在AsyncPipe
停止工作了。
这是预期的行为AsyncPipe
吗?如果是这样,有没有办法解决这个问题?或者,一种ChangeDetectorStrategy.OnPush
不触发控制事件火灾的方法?
编辑:
这是一个人为的例子,说明了我的意思:
@Component({
template: `
<button (click)="incrementEvent.next()">Increment</button>
<button (click)="decrementEvent.next()">Decrement</button>
<h2>Counter: {{ counterObservable | async }}</h2>
<!-- This should only run once but it runs on every click instead -->
<h2>Number of atoms in universe: {{ getNumberOfAtomsInUniverse() }}</h2>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class CounterComponent {
incrementEvent = new Subject<void>();
decrementEvent = new Subject<void>();
counterObservable: Observable<number>;
constructor() {
this.counterObservable = Observable.merge(
this.incrementEvent.map(() => 1),
this.decrementEvent.map(() => -1)
)
.startWith(0)
.pairwise()
.map(tup => tup[0] + tup[1])
}
getNumberOfAtomsInUniverse() {
// very expensive operation...
}
}