1

FirebenchはAngular/Zoneの猿のパッチを当てるwebSocketとsetIntervalなどのため、変更の検出をトリガーする多くの内部非同期呼び出しを使用します。私のアプリケーションとやりとりしていないときでも、特にモバイルでの処理速度を低下させる原因となります。どのようにして、FirebaseがAngular 2で変更検出を繰り返しトリガするのを防ぐことができますか?

このデフォルトの動作は便利かもしれませんが、私がFirebaseを使用している方法では、ビューを更新する必要がある時をかなり厳密に制御しているので、Firebaseのコールバックは変更検出が行われるようにとにかく手動で。

変更検出器の戦略をOnPushに設定するとわかりましたが、これは私が取り組んでいるところですが、あらゆる角度から攻撃したいと思います。

私はゾーンのrunOutsideAngularに精通していますが、Firebaseモジュール内ですべての非同期呼び出しが行われているので、今ここでそれを適用することはできません。

どのようにFirebaseがすべての業務を角度ゾーン外にすることができますか?


編集:問題を示すサンプルコード:

import {Component} from '@angular/core'; 

@Component({ 
    selector: 'test-component', 
    template: 'hello world' 
}) 
export class TestComponent { 
    ref: Firebase; 

    constructor() { 
    this.ref = new Firebase('<firebase URL>'); 
    } 

    ngDoCheck() { 
    console.log('Check the stack - this is being called continually via async functions used internally by Firebase.'); 
    debugger; 
    } 
} 

答えて

2

これは、振り返ってみると明らかであるが、単にゾーンの外側Firebase参照をインスタンス化するトリックを行いました。例えば:

import {Injectable, NgZone} from '@angular/core'; 

// ... 

@Injectable() 
export class DataService { 
    ref: Firebase; 

    // ... 

    constructor(
    private zone: NgZone 
    // ... 
) { 
    // Instantiate Firebase ref outside the zone to prevent its continual internal operations from triggering change detection 
    this.zone.runOutsideAngular(() => { 
     this.ref = new Firebase('<firebase URL>'); 
    }); 

    this.ref.on('value', snapshot => { 
     // Change detection will NOT automatically be triggered after this callback 
    }); 
    } 
} 

私のコンポーネントでngDoCheckにブレークポイントを置くことによって、私は戻って、ゾーンの外にそれを実行すると、それらを防止するであろうことを示唆した私はFirebase参照をインスタンス化し、その行へのすべての変更検出サイクルをトレースすることができました。

にはがありますので、必要に応じて検出を変更するようにしてください。例については、https://stackoverflow.com/a/34829089/458614を参照してください。

関連する問題