使用Zone.js获取无区域窗口方法

时间:2016-07-08 12:23:38

标签: javascript typescript angular zonejs

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

可能的用例示例是Angular 2应用程序,它在Angular 2 Material数据绑定方面存在一些问题,需要将未分区setTimeout称为临时但即时的解决方法 - 在问题得到正确修复之前。< / p>

5 个答案:

答案 0 :(得分:4)

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

constructor(private ngZone:NgZone) {
}

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

答案 1 :(得分:3)

是的,基本上可以通过

访问本机方法
target[Zone['__symbol__'](methodName)]

或     靶向[&#39;的 zone_symbol &#39;方法名]

,例如

window['__zone_symbol__setTimeout']

您可以通过

访问NativePromise
window['__zone_symbol__Promise']

我稍后会列出一个清单。

答案 2 :(得分:2)

添加答案,原始方法可以使用@State( Scope.Benchmark ) public abstract class TestBase { @Setup public void setUp( BenchmarkParams params ){} } @State( Scope.Benchmark ) public class TestImpl extends TestBase { @State( Scope.Thread ) public static class ThreadState { @Setup public void setUp( TestImpl state ){} } @Benchmark public void nothing( ThreadState state ){} } 前缀,从Zone.js 0.6.12开始(可能需要更改)。

即。 __zone_symbol__等等。

答案 3 :(得分: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)

答案 4 :(得分: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));
}