6

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

可能的用例示例是 Angular 2 应用程序,它在 Angular 2 材质数据绑定方面存在一些问题,需要调用 un-zonedsetTimeout作为临时但即时的解决方法 - 在问题得到正确修复之前。

4

5 回答 5

6

是的,基本上可以通过本机方法访问

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

或 target[' zone_symbol 'methodName]

window['__zone_symbol__setTimeout']

您可以通过以下方式访问 NativePromise

window['__zone_symbol__Promise']

我稍后会列一个清单。

于 2017-03-12T13:19:02.207 回答
4

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

constructor(private ngZone:NgZone) {
}

setTimeout(() => {
  this.ngZone.runOutsideAngular(() => {
    // do something
  });
}, 1000);
于 2016-07-08T12:30:08.927 回答
2

除了答案之外,从__zone_symbol__Zone.js 0.6.12 开始,可以使用前缀访问原始方法(可能会发生变化)。

window.__zone_symbol__setTimeout等。

于 2016-07-08T13:56:28.623 回答
1

我喜欢这样:

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)
于 2020-11-21T10:07:15.143 回答
0

您还应该注意 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));
}
于 2017-01-31T11:40:25.507 回答