【问题标题】:Why is ChangeDetectorRef.detectChanges() needed for Angular Stripe Integration?为什么 Angular Stripe 集成需要 ChangeDetectorRef.detectChanges()?
【发布时间】:2019-08-04 01:56:19
【问题描述】:

I'm reading through this tutorial on integrating stripe elements with Angular 我只是好奇为什么onChange 方法最后会调用detectChanges()onChange 方法作为事件侦听器添加到条带卡,如果onChange 收到错误,将分配一个错误。

onChange({ error }) {
  if (error) {
    this.error = error.message;
  } else {
    this.error = null;
  }
  this.cd.detectChanges();
}

【问题讨论】:

    标签: javascript angular typescript stripe-payments


    【解决方案1】:

    我猜这与 Angular 变更检测策略有关。

    每次在组件中传播事件(鼠标、单击、输入、XHR 等)时,默认策略都会检查视图。此策略不适用于复杂的应用程序,因为性能可能很糟糕。

    另一种方法是使用OnPush 策略。此策略仅在 @Input 已更改或您明确要求使用 ChangeDetectorRef.detectChanges(); 检测更改时重新呈现视图

    【讨论】:

      【解决方案2】:

      Stripe(和其他一些第 3 方)在 angular 区域之外运行,那么我们需要使用 ChangeDetectorRef。另一个使用选项也是NgZone。我对 Stripe 在 Angular 区域之外的工作方式有点好奇,因为原因可能会有所不同。对于 Stripe,根据 this

      Angular Zones 正在猴子修补(几乎)所有异步 API!区域拦截异步事件并触发对特殊事件的更改检测。 Zones 负责 XMLHttpRequests、fetch、setTimeout 等。然而,Stripe 使用隐藏的 iframe 来建立对其 API 的请求,而不是 zone.js 负责的 API。

      进一步阅读 zoneschange detectiondifference between NgZone and ChangeDetectorRef

      【讨论】:

      • 谢谢 - 很好的答案 - 它应该是被接受的 - 但我保留原样,因为马丁可以使用积分。
      • 没问题,我的好奇心得到满足,没关系:P
      猜你喜欢
      • 2021-04-10
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 2019-07-07
      • 1970-01-01
      相关资源
      最近更新 更多