2016-05-17 140 views
0

我有一个Angular2组件,它有一个自定义的第三方JQuery插件(我们必须使用并且不能更改),它在OnInit事件中初始化。然而,这个第三方库使用了setIntervals。如果我远离视图导航,则间隔仍然处于活动状态,而在其他视图中,它们会一直触发小部件行为。是否可以清除在NGZone中设置的所有间隔?

第三方组件无法销毁它或清除间隔(这不是很好)。我曾希望在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 - 或者如果我只是做了一些完全错误的区域让我知道。这是我的全部新

+0

当jQuery组件在Angular之外使用时,这将如何完成? –

+0

@GünterZöchbauer - 当我检查NGZone时,它似乎意识到已经设置的区间?我的理解是NGZone拦截了所有对SetInterval,SetTimout,Alert等的调用。这个帖子在github https://github.com/angular/zone.js/issues/211这个帖子中似乎暗示了它是可能的,但我没有了解如何。 NGZone似乎没有暴露出去改变SetInterval等 – GraemeMiller

回答

1

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

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); 

该代码很可能缺乏一些检查,阅读文档。另外我不确定角度是否可以。

+0

所以它实际上不可能使用NGZone?你必须下降到区域?任何想法Angular会遇到什么样的问题 - 需要注意什么? – GraemeMiller

+0

NgZone只是具有特定于angular2的API的抽象,它并不公开区域方法。你可以在github上找到它的源代码。 – kemsky

1

1)run VS runOutsideAngular

当调用runOutsideAngular,变化检测将不会异步操作(后setTimeout,evetns,XHR,..)从你的插件开始触发。

当调用run(更好的是直接调用3rdPartyWidgetStart)的变化检测将任何异步运算后执行。

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

2)清除一个定时器,

你可以做的是叉当前区域传递ZoneDelegate将累积计时器ID和你ngOnDestroy取消。

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

+0

真的很感谢您花时间回复。想要修复第三方插件 - 技术上要简单得多....任何有关ZoneDelgate for NGZone文档的想法。NGZone似乎没有叉选项。 – GraemeMiller

相关问题