可以使用加载的Zone.js以某种方式访问无区域window
方法(setTimeout
等)吗? Zone.js是否公开了原始的未修补方法?
可能的用例示例是Angular 2应用程序,它在Angular 2 Material数据绑定方面存在一些问题,需要将未分区setTimeout
称为临时但即时的解决方法 - 在问题得到正确修复之前。< / p>
答案 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']
您可以通过
访问NativePromisewindow['__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));
}