私はAngular/AngularJSアップグレードアプリを持っており、現在AngularJSからAngularにすべてを移行中です。それはかなり大きなプロジェクトなので、私は間違いなくアップグレードの方法をとる必要があります。
@ uirouter/angular-hybridを使用し、ルート状態はまだAngularJS(ナビゲーションなど)であり、子ビューがあります。この子ビューでは、すべてのコンポーネントをゆっくりとAngularにアップグレードしています。パフォーマンス上の理由から、UpgradeModuleの代わりにdowngradeModule()( https://angular.io/guide/upgrade-performance )を使用する必要がありました。
UIコンポーネントには、Angular Material2を使用します。
セットアップについてはこれだけです、質問/問題:
ページのあるタブがバックグラウンドにあり、後で(少なくとも5〜10分)ページに戻ると、ページ全体が遅れて応答しなくなります。離れている時間が長く、タブがバックグラウンドにあるほど、ラグは長くなります。
私がすでに試した/見つけたもの:
ngZone: 'noop'
を使用しても効果はありません私は現在、問題を再現し、さらにテストするためのコンテキストを増やすために、クリーンなサンプルアプリに取り組んでいます。すぐに追加します。
角度:6.1.0
AngularJS:1.7.2
zone.js:0.8.26
@ uirouter/angular-hybrid:6.0.0
更新(2019年8月)
現在のLibバージョンでまだ発生Angular 8、AngularJS 1.7.8&uirouter/hybrid 8
すべてのng2コンポーネントでこの実装パターンを利用してみてください。
https://angular.io/api/core/ChangeDetectorRef#detach-change-detector-to-limit-how-often-check-occurs
コンセプトは、angularjsによる更新やレンダリングからコンポーネントを削除することです。
ドキュメントから:
class DataListProvider {
// in a real application the returned data will be different every time
get data() { return [1, 2, 3, 4, 5]; }
}
@Component({
selector: 'giant-list',
template: `
<li *ngFor="let d of dataProvider.data">Data {{d}}</li>
`,
})
class GiantList {
constructor(private ref: ChangeDetectorRef, private dataProvider: DataListProvider) {
ref.detach();
setInterval(() => { this.ref.detectChanges(); }, 5000);
}
}
@Component({
selector: 'app',
providers: [DataListProvider],
template: `
<giant-list><giant-list>
`,
})
class App {
}
基本的にコンポーネントをdetach()してから、手動で変更を検出します。
タブが読み込まれるたびにサービスを破棄してから、新しいイベントを作成して新しい変更をリッスンしてみてください。
また、これは機能する可能性がありますが、README @ https://github.com/ui-router/angular-hybrid#limitations を考慮すると回避策です。
READMEのこのセクションは、ダウングレードがシームレスなオプションではないことを示唆している可能性があります。
制限:
現在、Angular(2+)またはAngularJS(1.x)コンポーネントのAngularJS(1.x)ui-viewへのルーティングをサポートしています。ただし、AngularJS(1。 x)コンポーネントをAngular(2+)ui-viewに。
Angular(2+)ui-viewを作成する場合、ネストされたui-viewもAngular(2+)である必要があります。
このため、アプリはリーフの状態/ビューから移行し、ルートの状態/ビューに向かって進む必要があります。
UrlHandlingStrateryを調べてみましたか? AngularJSスタックの上でAngularを使用し、必要に応じてゆっくりと書き直しました。
AngularとAngularJSルーターの両方を使用し、UrlHandlingStrategyを使用して、Angularで処理するルートを決定し、ルートを処理しないかどうかを決定しました。 Angularによって処理された後、AngularJSルートに移動します。
あなたのセットアップを調べずに、私は推測することしかできません。たぶん、ルートがいつも行き来しているからでしょう