是否可以清除 NGZone 中设置的所有间隔?

Is it possible to clear all intervals set within NGZone?

我有一个 Angular2 组件,它有一个自定义的第 3 方 JQuery 插件(我们必须使用并且不能更改)在 OnInit event.However 中初始化第 3 方库自由使用 setIntervals。如果我离开视图,间隔仍然有效,而在其他视图上,它们会继续触发小部件行为。

第 3 方组件无法销毁它或清除间隔(这不是很好)。我曾希望在 Angular2 OnDestroy 方法中调用 destroy() 或类似方法。

我想我应该可以使用 Zone 来清理。我做了以下事情:

constructor(elementRef: ElementRef, public zone: NgZone) {
    }

ngOnInit() {
    this.zone.runOutsideAngular(() => {
        $(this.elementRef).3rdPartyWidgetStart();
    });}

ngOnDestroy() {
    var componentzone=this.zone;
    //So do something here to clear intervals set within Zone???
}

我以为它会在我离开时清除间隔。然而,情况似乎并非如此。我还尝试了 run 而不是 runOutsideAngular,但似乎没有帮助。然后我认为 Zone 应该知道所有已设置的间隔,我可以通过它清除它们。它似乎确实认识他们,但似乎无法访问列表并清除它们?使用 Angular 2 RC 的任何想法 - 或者,如果我只是对 Zones 做了一些完全错误的事情,请告诉我。这对我来说是全新的

1) run 对比 runOutsideAngular

调用 runOutsideAngular 时,更改检测不会在您的插件启动异步操作(setTimeout、evetns、XHR 等)后触发。

当调用 run 时(更好的方法是直接调用 3rdPartyWidgetStart)变化检测将在任何异步操作之后执行。

选择适合您的项目的任何方式(即您是否需要 运行 CD 在 setTiemout、事件、......之后?)。

2) 清除setTimeouts

你可以做的是通过一个 ZoneDelegate 分叉当前区域,它会累积计时器 ID 并在你的 ngOnDestroy.

中取消它们

但是解决这个问题的最好方法可能是修复 jQuery 插件。

我应该说,您自己承担风险。直接使用区域:

    Zone.current.fork({
        name: 'jquery', onScheduleTask: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone,
                                                  task: Task)=>
        {
            if(task.source === 'setInterval'){
                console.log('capture', task);
                //data has handleId property, interval id
                this.interval = task.data; 
            }
            return parentZoneDelegate.scheduleTask(targetZone, task);
        }
    }).run(()=>
    {
        setInterval(()=>
        {
            console.log('jquery interval', Zone.current);
        }, 5000);
    });

代码中某处:

clearInterval(this.interval.handleId);

此代码很可能缺少一些检查,请阅读文档。我也不确定 angular 是否可以接受。