使用 Zone.js 获得无区域 window 方法

Get zone-free window methods with Zone.js

无区域 window 方法(setTimeout 等)是否可以通过加载 Zone.js 以某种方式访问​​? Zone.js 是否公开了原始未修补的方法?

可能用例的示例是 Angular 2 应用程序在 Angular 2 Material 数据绑定方面存在一些问题,需要调用未分区的 setTimeout 作为临时但即时的解决方法 - 在问题得到妥善解决之前。

我认为您需要为此利用 NgZone 及其 runOutsideAngular 方法。这是一个示例:

constructor(private ngZone:NgZone) {
}

setTimeout(() => {
  this.ngZone.runOutsideAngular(() => {
    // do something
  });
}, 1000);

添加到答案中,从 Zone.js 0.6.12 开始,可以使用 __zone_symbol__ 前缀找到原始方法(可能会有所变化)。

window.__zone_symbol__setTimeout,等等

您还应该注意 Promise::then

我在我的项目中实现了以下 util 函数

function jb_new_NativePromise(cb) {
  if (window && window.__zone_symbol__Promise) {
    var res = new __zone_symbol__Promise(cb);
    res.then = res.__zone_symbol__then;
    return res;
  }

  return new Promise(cb);
}

function jb_NativePromise_resolve(obj) {
  return jb_new_NativePromise(resolve=>resolve(obj))
}

function jb_native_delay(ms) {
  var set_timeout = window && window.__zone_symbol__setTimeout || setTimeout;
  return jb_new_NativePromise(resolve => set_timeout(resolve, ms));
}

是的,基本上本地方法可以被

访问
target[Zone['__symbol__'](methodName)]

或 target['zone_symbol'methodName]

例如

window['__zone_symbol__setTimeout']

您可以通过

访问 NativePromise
window['__zone_symbol__Promise']

稍后我会列一个清单。

我喜欢这样:

const w: any = window
export const setTimeoutNoZone: typeof setTimeout = w.__zone_symbol__setTimeout
export const setIntervalNoZone: typeof setInterval = w.__zone_symbol__setInterval

然后在不需要ChangeDetection的地方使用它们:

setTimeoutNoZone(() => { ... }, 1000)