2017-06-06 15 views
0

StackOverflowで多くの人と同じ問題を抱えた後、「外角ゾーン」サービスとは何かを理解できませんでしたか?角度2:サービスを「外側」の角度ゾーンにするにはどうすればよいですか?

は、私がチェックし、このテーマの周りのすべての既存の質問をした、と私はこの1つお聞きしneederなぜそれが正確だ:

デフォルトの変更があるコンポーネントのコード例DetectionStrategy: (ビューで参照this.valueを考慮して)

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

は、与えられたサービスがあれば、ビュー一方、リフレッシュで、 "角度の範囲外"ではありません「外側の角度ゾーン」が更新されていません。がChangeDetectorRef.detectChanges()を呼び出さない限り、表示されません。

したがって、問題は、サービスが「角度ゾーン」の内側か外側かを知るための条件ですか?

答えて

2

希望するコードはNgZone.isInAngularZone()です。これはそこで実行されているかどうかを示します。

出典:壁に向かって私の頭を叩いた時間。これを書く前にAngular docsを読んでください。

さらに、あなたのサービスに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

'zone.runOutsideAngular'で実行することは、ビューを更新しません。 –

0

私は自分で自分の回答を見つけたように見えますが、私はそれが他の人のために援助することを願っています:

「角度範囲外」のサービスは、角コンテキスト内でインスタンス化されなかったクラスです。静的アクセサを使用して 多くの図書館が、この場合にも影響を受けやすい、ここでの例です:

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

私の運はそれが使用したのと同じライブラリだったということです。この外部リソースで説明されているように、外部ライブラリオブジェクトをインスタンス化すると、ビューの更新の問題が解決され、このサービスを「Inside Angular Zone」にすることができます。

関連する問題