問題タブ [ngzone]
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.
angular - Angular 2: 関数が promise から呼び出されたときにビューが更新されない
私の角度はかなり基本的です。オブジェクト (サービス内) を表示するビューがあります。
私のサービスの単純なバージョンは次のようになります。
サービスを呼び出すボタンを作成すると、すべてが機能し、ビューが更新されます。
ビューコンポーネントでのサービス呼び出し:
しかし、ダイアログ ウィンドウから promise を呼び出すと、ビューが更新されません。
コンポーネント (簡略化):
ngZone と ChangeDetectionStrategy.Default の両方を試しました。どちらのソリューションもうまくいきませんでした。オブジェクトが両方の時間で変更され、コンソール ログも機能していることがわかります。しかし、ビューは更新されません。
私の @Componment には興味深いものがありません。クラス全体の場合は次のとおりです。
そして、私のグループ追加ダイアログの場合は次のとおりです。
編集:すべてをプランカーに抽出するのは非常に難しいですが、私はそれを再作成しようとしましたが、約束が機能することがわかりました. 障害は MatDialog にあると思います。メイン ビューは更新されません。プランカーで全体を再作成しようとしましたが、プランカーで角度のあるマテリアルが機能しません。そして、ネット上の他のすべての例も同様に壊れているようです:
angular - NullInjectorError: NgZone のプロバイダーがありません! (Angular 6 ライブラリ)
概要
Angular 6 ライブラリを作成しましたが、それを作成したプロジェクトの外部で使用しようとするとエラーが発生します。これは大量のコードのように見えますが、ほとんどが CLI によって生成されたボイラープレートです。
最小限の作業テスト ケース
Angular 6 CLI を使用して非常に基本的なライブラリを作成しました。
次に、 に追加 <lib-example></lib-example>
してsrc/app/app.component.html
を実行ng serve
し、サンプル コンポーネントが期待どおりに動作することを確認できます。
次に、タグprojects/example/src/lib/example.component.ts
に an を追加するように編集します。*ng-if="true"
<p>
ngIf
ディレクティブを取得するには、 import をインポートBrowserModule
するので、projects/example/src/lib/example.module.ts
次のようになります。
再構築:
私のコンポーネントはまだ何も役に立ちませんが、作成に使用したのと同じプロジェクト内で使用する限り機能します。
動作しない最小限のテスト ケース
別のアプリでライブラリを使用してみましょう。ライブラリを含むアプリと同じディレクトリにある新しいアプリを生成することから始めます。
次に、ライブラリを に追加<lib-example></lib-example>
しmyapp/src/app/app.component.html
てインポートすると、myapp/src/app/app.module.ts
次のようになります。
エラーメッセージ
アプリを参照すると、コンソールに次のエラーが表示されます。
私は何を間違っていますか?
angular - EventEmitter イベントから最適な ngZone への再入力
一部のライブラリをカプセル化するコンポーネントがあります。このライブラリのすべてのイベント リスナーの変更検出の悪夢を回避するために、ライブラリは angular ゾーンの外側にスコープが設定されています。
それはすべて非常に明確で一般的です。次に、アクションを発行するイベントを追加しましょう。
問題は、このエミッターがゾーン外でトリガーされるため、変更検出をトリガーしないことです。その場合に可能なことは、ゾーンに再び入ることです。
最後に、私は質問に行きます。this.ngZone.run
親コンポーネントでこのイベントをリッスンしていなくても、これにより変更検出が強制されます。
これは望ましくありません。なぜなら、私はそのイベントをサブスクライブしなかったためです => 検出するものは何もありません。
その問題の解決策は何ですか?
実際の例に興味がある人は、質問の起源はここにあります。
javascript - DOM ビューが更新されず、Angular がゾーンにありません
ゾーンに関連する問題があり、それを機能させることができません。私は角度が初めてですが、基本的なjavascriptの理解があります。
だから問題は何ですか、ビューを更新できません。
イオンBLE用のサードパーティライブラリを使用しており、これをプロバイダーで使用しています
providers/communication-controller.ts
set_ble_tolisten() は promise にサブスクライブするために呼び出されます。データが受信されると、handlereceiveddata() が呼び出されます。
データを送信するために ble_communication_controller() が呼び出され、この関数はコールバックを受け取り、それが格納されます。ble デバイスが応答すると、handlereceivedata() が呼び出されます。次に、ble_communication_controller() 呼び出しに格納されているコールバックを呼び出します。
ページ、構成を作成しました。これには ts、html および scss ファイルが含まれます
configuration.ts
ページが読み込まれると、ionViewDidEnter が呼び出されます。問題は、プロバイダーから update_state_gui が呼び出されることです。データはこの関数で受け取ります。isInAngularZone は、それが false であり、ゾーン外であることを示しています。Relay_1_toggle と Relay_2_toggle は、html のトグル ボタンです。
そして更新されないので、ngzone.runまたはタイムアウトとmarkForCheck()を試しました。しかし、それは機能しません。
ご協力いただきありがとうございます