2

通过查看在中实现更改检测的方式,如果已分离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...
  }
}
4

1 回答 1

0

是否找到了解决方案?AsyncPipe我也考虑通过不使用任何 ChangeDetection 机制来加速我的应用程序。

于 2021-08-24T12:01:45.160 回答