2017-06-06 106 views
0

有同樣的問題,很多人在計算器上我沒明白什麼是「外部角區」服務後?角度2:什麼使服務成爲「外部」角區域?

我已經檢查解決此問題的所有存在的問題,而且它也正是爲什麼我needer問這一個:

具有默認更改的任何組件中的代碼示例DetectionStrategy: (考慮THIS.VALUE在視圖中引用)

this.myService.method().subscribe(e => { 
    this.value = e; 
    }); 

是給定的服務 「外角區」,認爲刷新,而另一方面,如果這是「外角區域」,視圖不是刷新,除非我們調用ChangeDetectorRef.detectChanges()。

所以,問題是:如何知道的情況,如果一個服務是內部或外部的「角區」?

回答

2

你想要的代碼是NgZone.isInAngularZone()。這會告訴你它是否在那裏執行。

來源:敲我的頭靠在牆上寫這之前讀取角文檔的時間。

此外,你可以注入NgZone到你的服務,並嘗試使用this.ngZone.run(() => yourSubscriberCallback())這應該有所幫助,雖然我有非常複雜的結果嘗試這一點。

編輯:好吧,我設法讓我的東西工作,讓我們看看它是否可以幫助你。

在我的情況下,我正在使用第三方庫,包括一個監聽器的變化。我正在使用RXJS BehaviorSubject通過服務將這些更改傳播到各個組件,但這些更改沒有被拾取。

事實證明,這是因爲我在偵聽器中使用的方法在AngularZone之外執行。

起初,我這樣做:

export class Service { 

    public BehaviorSubject<Thing> thingSubject = new BehaviorSubject<Thing>(new Thing()); 

    constructor(private ngZone:NgZone) { 
    thirdPartyLibrary.listen(ngZone.run(() => myCallback.bind(_this))); 
    } 

    ... 

} 

而且myCallback在做:

myCallback(thing) { 
    this.thingSubject.next(thing); 
} 

原來,這似乎並沒有在正確的角度帶內執行。我改變了我的代碼,這雖然和它的工作:

export class Service { 

    public BehaviorSubject<Thing> thingSubject = new BehaviorSubject<Thing>(new Thing()); 

    constructor(private ngZone:NgZone) { 
    thirdPartyLibrary.listen(myCallback.bind(_this)); 
    } 

    myCallback(thing) { 
    this.ngZone.run(() => this.thingSubject.next(thing)); 
    } 

} 

這樣做,我的所有訂戶收到的角度帶內的消息,並引發預期的更新之後。

0

據我知道,那是不可能的檢查是否東西運行「內部」和「外部」的角區。如果您使用zone.runOutsideAngular它會在您的區域外運行。第二個出現在我的腦海裏:你爲什麼想知道?

+0

不一定在運行時。我想知道什麼樣的服務能夠自動更新視圖以及哪些服務不是。 – Sid

+0

everthing你將運行在'zone.runOutsideAngular'不會更新視圖。 –

0

它看起來像我找到了我的迴應我自己,但我希望這將是爲其他人的幫助:

「外部角區」服務是沒有角上下文中實例化一個類。 使用靜態存取許多圖書館都有待於在這種情況下,這裏有一個例子:

http://techqa.info/programming/question/34592857/view-is-not-updated-on-change-in-angular2

我的運氣,它是使用相同的庫。如此外部資源中所述,設法實例化外部庫對象將解決視圖刷新問題,並讓此服務成爲「內部角區域」。