使用 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)
无区域 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']
您可以通过
访问 NativePromisewindow['__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)