2017-11-23 5 views
0

たぶん私は間違って使用しているが、私はそれを理解することはできません。Observable.of(配列)とangleの非同期パイプを使用すると、私はいくつかの奇妙な振る舞いをしています。setIntervalが呼び出されるたびにObservable.of(配列)が更新されます。

私はIonic 3(angular 4)にview.htmlとview.tsファイルを持っています。私はObservable.of(items)をやっています。 Itemsはオブジェクトを含む配列です。私の見解では、私は持っています:非同期。それはすべて素晴らしいですが、私はまた、1000ミリ秒ごとにview.tsのsetIntervalを実行すると... 1000ミリ秒ごとにビューが更新されます。 setIntervalが何もしない場合でも!

間違っていますか?私はその行動を理解できません..!

答えて

0

OnPush戦略を使用してください。この戦略では、影響を受けるアイテム、つまりイベントが発生したコンポーネントまたは評価のためにマークされたコンポーネントのみが評価されます。また、アイテムは浅いモードで比較されます。つまり、参照のみがチェックされます。これには、オブジェクトを変更しないことが必要です。

インポートChangeEnter/CoreからChangeStatisticsを取得し、changeDetection:ChangeDetectionStrategy.OnPushを@Componentデコレータに追加します。

例えば、this.array.push(value)の代わりにthis.array = this.array.concat(value)を使用してください。

httpコールまたはタイマーのように値が非同期に更新される場合は、ChangeDetectorRefを追加し、コールバックにmarkForCheck()を呼び出します。

+1

これは役に立ちますが、新しいオブジェクトがリストにプッシュされたときに私のビューは更新されません。 @componentとObservable.of()+ asyncパイプにChangeDetectionStrategyがあります。 –

+0

押さないでください。新しい配列を作成するためのConcat。 –

+1

値は非同期に更新されますので、markforcheck()を使ってトリックを実行しました!ありがとう! –

1

setIntervalメソッドは、変更検出サイクルをトリガーするような方法で「パッチ」されています。

詳細はhereをご覧ください。

リンクのいくつかの関連セクション:

基本的には三つのことが原因で発生することができ変更、アプリケーションの状態:

イベント - 、提出し、クリックし...

XHR - フェッチリモートサーバからのデータ

タイマ - setTimeout()、setInterval()

これらはすべて非同期です。結局のところ、 の非同期操作が実行されるたびに、私たちの アプリケーション状態が変更された可能性があります。これは、誰かが に角度を指定してビューを更新する必要があるときです。

誰が角に通知しますか?

申し訳ありませんが、アプリケーションの状態が変更される原因がわかりました。しかし、それは何を伝えるものです 角度、この特定の瞬間に、ビューを更新する必要がありますか? Angularでは、ネイティブAPIを直接使用できます。 というインターセプタメソッドがないので、Angularは DOMを更新するように通知されます。純粋な魔法ですか?最新の記事に従っていれば、 はゾーンがこれを処理することを知っています。実際、Angularには という独自のゾーンNgZoneがあります。これについては、記事のゾーン でAngularで書いています。あなたはそれを読むこともできます。短いバージョンは、 で、Angularのソースコードのどこかに、NgZones onTurnDoneイベントをリッスンする ApplicationRefというものがあります。 このイベントが発生するたびにtick()関数が実行され、実質的に が変更検出を実行します。

+0

説明をありがとう!私は今行動がどこから来ているのか知っています。しかし、解決策を探しています。 –

関連する問題