Angular 代码是否在区域中运行,如果是,为什么以及如何运行?

Angular 代码是否在区域中运行,如果是,为什么以及如何运行?,angular,google-maps,rxjs,angular-material,Angular,Google Maps,Rxjs,Angular Material,嗨,我在读来自的trought代码。这一切都很清楚,但有一件事。下面的代码是我(从)没有理解的 /**获取一个可观察对象,当消费者订阅该对象时,该对象会将事件侦听器添加到映射中*/ getLazyEmitter(名称:字符串):可观察{ 常量可观察=新可观察(观察者=>{ //如果目标尚未初始化,请缓存观察者,以便稍后添加。 如果(!this.\u目标){ 这个._pending.push({observatable,observator}); 返回未定义; } const listener=t

嗨,我在读来自的trought代码。这一切都很清楚,但有一件事。下面的代码是我(从)没有理解的

/**获取一个可观察对象,当消费者订阅该对象时,该对象会将事件侦听器添加到映射中*/
getLazyEmitter(名称:字符串):可观察{
常量可观察=新可观察(观察者=>{
//如果目标尚未初始化,请缓存观察者,以便稍后添加。
如果(!this.\u目标){
这个._pending.push({observatable,observator});
返回未定义;
}
const listener=this.\u target.addListener(名称,(事件:T)=>{
this._ngZone.run(()=>observer.next(事件));
});
这个。_listeners.push(listener);
return()=>listener.remove();
});
可观测收益;
}
/**设置管理器应将事件绑定到的当前目标*/
setTarget(目标:MapEventManagerTarget){
如果(目标===此.\u目标){
返回;
}
//从预先存在的目标清除侦听器。
如果(这个目标){
这个;
这个。_pending=[];
}
这个._target=target;
//添加在映射初始化之前绑定的侦听器。
这个.u pending.forEach(subscriber=>subscriber.observable.subscribe(subscriber.observer));
这个。_pending=[];
}
这一行我尤其不清楚。为什么以及如何连接。让它流回ngZone的部分在哪里

this.\u pending.forEach(subscriber=>subscriber.observable.subscribe(subscriber.observer))


区域恢复:
this.\ngZone.run(()=>observer.next(event))

Zone.js的主要用途是在发生异步操作时通知angular,并根据angular可以决定是否呈现UI

Zone处理大多数异步API,如setTimeout(), Promise.then()和addEventListener()。有关完整列表,请参见区域 模块文档。因此,在这些异步API中,您不需要 手动触发更改检测

仍然有一些Zone无法处理的第三方API。在里面 在这些情况下,NgZone服务提供了一个run()方法,允许 您需要在角度区域内执行函数。此功能,以及 该函数中的所有异步操作都会触发更改检测 在正确的时间自动地

angular无法检测与映射相关的事件,因为这些事件被视为自定义事件,而不是任何异步API(如上所述)的一部分。这就是为什么他们明确地强制这些事件在区域内运行。因此angular可以检测这些事件并触发相应的变化检测

有关更多信息,请参阅:


如果您在/中看到以下几行,它们将google map实例设置为setTarget函数。因此,通过使用getLazyEmitter,他们将特定于映射的侦听器附加到映射实例。同样,如果您签入google-map.ts,您可以看到它们通过声明@output事件来附加侦听器。因此,每个@output都有map侦听器作为可观察的。发生映射事件时,将调用“this.\u target.addListener”中的回调函数,即ngZone

看看这些@martin我知道分区的用途,我想知道
setTarget
是否以及如何连接回分区。
getLazyEmitter
函数明确说明了它是如何回到分区的,但是
setTarget
不是。我的问题不是为什么会有分区管理。(这是因为这些标记和其他标记是在区域之外故意创建的)。我想知道当目标设定后它是如何回到区域的。