2016-12-07 10 views
1

私のアプリケーションにAngular 2.1.1を使用しています。角2 - 変化の検出の問題

シナリオ
相互作用する2つのコンポーネントを考えてみましょう。 DeviceSettingsComponentがアクティブで、ユーザーに表示されます。ボタンハンドラメソッドは、基本的には、イベントを発する

<a class="close" (click)="closeDeviceSettings()">&times;</a> 

private closeDeviceSettings(): void { 
    this.sharedService.broadcast('deviceSettingsClosed'); 
} 

MainComponentは、そのイベントを聴いている:

this.sharedService.on('deviceSettingsClosed',() => this.isDeviceSettingsOpen = false); 

MainComponentテンプレートから:それはのように閉じるボタンがあります

<div class="main-device-settings" *ngIf="isDeviceSettingsOpen"> 
    <device-settings [device]="openSettingsData.device"></device-settings> 
</div> 

これはAngular 2.1.1で問題なく動作します。

通報
IはAngular 2.2.xにアップデート閉じるボタンをクリックするとDeviceSettingsComponentはDOMから除去/破壊されるとの間の3-5秒の遅延がある場合。 (package.jsonのAngularバージョンの他に)コードが変更されていません。
イベントに問題はないとわかりますが、MainComponentisDeviceSettingsOpenプロパティはすぐに閉じるボタンをクリックすると更新されます。変更検出が何とか遅れているように思えます。

誰かが何が起こっているのかを知っていますか?

アップデートは私が右のように私の財産を更新した後、手動で変化検出を呼び出すことによってそれを修正するために管理:

constructor(private changeDetectorRef: ChangeDetectorRef) { } 

ngOnInit() { 
    this.sharedService.on('deviceSettingsClosed',() => { 
     this.isDeviceSettingsOpen = false 
     this.changeDetectorRef.detectChanges(); 
    }); 
} 

コンポーネントは、今すぐにDOMから削除されます。しかし、私はこの解決策が気に入らず、なぜそれが必要なのか理解していません...

+0

ボタンをクリックした直後にページをクリックすると(ページ内の任意の場所をクリックすると)速く更新されますか? – borislemke

+0

いいえ、それはありません。 – lenny

+0

ああ、私はそれが変化検出戦略の問題だと思ったが、それはそうではないことを確認した。プロジェクトでこの問題を再現できませんでした。共有サービスでSubscriptionとObservableを使用していますか? – borislemke

答えて

0

私は同僚のプロジェクトで同様の問題に遭遇しました。問題は、コンポーネントのテンプレートに重いロジックがあったことです(テーブルの文字列からの日付の解析)。

ボタンをクリックすると、ビューが更新され、再びすべての日付が解析されました。

ボタンのクリックハンドラの内容を削除して、ページが再び反応するまでボタンをクリックしてから3〜5秒の遅延があるかどうかを確認してください。もしそうなら、問題はハンドラではないことを意味します。

ビュー(コンポーネントテンプレート)に複雑なロジックがあるかどうかを確認してください。

この問題の解決方法は、問題の原因である場合は、問題のあるロジックをコンポーネント自体に移動し、ビュー内の計算結果を使用します。

+0

彼のコメントから "私は両方を使用しますが、イベントがすぐに受信され、isDeviceSettingsOpenプロパティが(一部のconsole.logを使用して)更新されていることを確認しました。 – borislemke

+0

@borislemke私はビジネスロジックの略語として "ロジック"を使用します。私が書いたように、問題はボタン自体やそれが実行するアクションとは無関係かもしれません。たとえば、OPにCSV値から行データを取得する巨大なテーブルがあり、CSVの分割がビュー上で行われた場合、ボタンをクリックするたびにテーブルを構築するプロセス全体が再び実行される可能性があります。このロジックは、ボタンにバインドされているロジックではなく、問題のあるロジックである可能性があります。 – Shai

+0

はい、わかりました。しかし、彼は変数が虚偽にカハングしている瞬間から、ボタンが実際に削除されるのは2〜5秒かかると言います。これらの2つのイベントの間には「論理」はありません。 – borislemke