2016-05-17 52 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

相關問題