可以通过加载的 Zone.js 以某种方式访问无区域window
方法(setTimeout
等)吗?Zone.js 是否公开了原始未打补丁的方法?
可能的用例示例是 Angular 2 应用程序,它在 Angular 2 材质数据绑定方面存在一些问题,需要调用 un-zonedsetTimeout
作为临时但即时的解决方法 - 在问题得到正确修复之前。
可以通过加载的 Zone.js 以某种方式访问无区域window
方法(setTimeout
等)吗?Zone.js 是否公开了原始未打补丁的方法?
可能的用例示例是 Angular 2 应用程序,它在 Angular 2 材质数据绑定方面存在一些问题,需要调用 un-zonedsetTimeout
作为临时但即时的解决方法 - 在问题得到正确修复之前。
是的,基本上可以通过本机方法访问
target[Zone['__symbol__'](methodName)]
或 target[' zone_symbol 'methodName]
如
window['__zone_symbol__setTimeout']
您可以通过以下方式访问 NativePromise
window['__zone_symbol__Promise']
我稍后会列一个清单。
我认为您需要为此利用 NgZone 及其runOutsideAngular
方法。这是一个示例:
constructor(private ngZone:NgZone) {
}
setTimeout(() => {
this.ngZone.runOutsideAngular(() => {
// do something
});
}, 1000);
除了答案之外,从__zone_symbol__
Zone.js 0.6.12 开始,可以使用前缀访问原始方法(可能会发生变化)。
即window.__zone_symbol__setTimeout
等。
我喜欢这样:
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)
您还应该注意 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));
}