問題タブ [behaviorsubject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
1294 参照

angular - getter を使用した ChangeDetection

私はExpressionChangedAfterItHasBeenCheckedErrorgetter と BehaviorSubject を取得しています (楽しいですよね?)。

これがコンポーネントのコードです

commonService.windowHeightBehaviorSubject です。通常のブラウザでこのコードを実行すると、すべてがうまくいきます。

コンポーネントで単体テストを実行しようとすると、問題が発生します。すべてのインポート、宣言、およびプロバイダーは問題なく、このような単純なテストでも問題ありません

それはスローしますError: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '0px'. Current value: '865px'.

ここで何が問題になる可能性がありますか? 環境: Angular 4.0.2、Angular CLI、カルマ、ヘッドレス Chrome。

ありがとう!

0 投票する
2 に答える
8790 参照

angular - Angular 4 - サービスでの rxjs BehaviorSubject の使用

私のサービスコードは以下のようになります -

データサービス

検索コンポーネント(上記のサービスにヒットし、サブスクライブも行う) は以下のようになります -

上記のように、ログが出力されず、コンソールにエラーが表示されないため、監視コンポーネントのサブスクライブ メソッド内に制御が入りません。適切な方法で BehaviorSubject を使用しているかどうかはわかりません。

次のリンクをたどってみました -

Angular 2 - 行動主体と観察対象? →こちらに記載のサブスクライブには入っていません。
http-observables -> この方法を試してみると、サブスクライブに入りますが、ログのエラーがスローされます -

サービスからデータを取得する前でもコンポーネント ログが印刷されるため、null のプロパティ xyz を読み取れません 。上記のエラーが発生した後、サービス ログが後で印刷されます。

私の意図は、サービスにヒットする SearchComponent 自体から BehaviorSubject にサブスクライブすることではありません。コンポーネントのサービスから値を取得するかどうかをテストしようとしています。サブスクライブの構文はすべてのコンポーネントで同じであるため、 serviceRequestDto値を必要とする他のコンポーネントからサブスクライブするのと同じくらい良いと思います。

更新 1:

ブランドンの提案に従って ReplaySubject(1) を使用しようとしましたが、コンポーネントでサブジェクトをサブスクライブしているときにエラーが発生しました。

TypeError: undefined(…) のプロパティ 'name' を読み取れません

更新されたサービスコードは次のようになります。

以前、サービスコードで次を使用していたことに注意してください-

更新された検索コンポーネントのコードは次のようになります -

以前のコンポーネント コードがサブジェクトにサブスクライブしていた方法は異なり、エラーはありませんでしたが、コントロールがコンポーネントのサブスクライブ内に入ることはありませんでした。

私の最初のコードは、現在投稿したものとは異なり、次のリンクに基づいていました- delegation-eventemitter-or-observable-in-angular2