問題タブ [angular2-changedetection]
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 - Angular2 でコンポーネントの変更検出を拡張する
このような List オブジェクトがあります
基本的にいくつかの URL があり、これらの URL にある名前を提供できます。
これらの名前を表示するコンポーネントが必要です。
これまでのところとても良いです。このように使用すると機能します
ただし、実際には何も変更しないため、呼び出されても更新somelist.addUrl(...)
されません。
回避策は、次のように変更するものを導入することです。
それに応じて Lister を使用します。
しかし、これは呼び出し元にとって不必要に複雑なようです。
私はどちらかというと、Lister 自体がリストの変更を「リッスン」するようにしたいと考えています。
これを達成する方法はありますか?
angular - Angular 2 のデフォルトの changeDetection として ChangeDetectionStrategy.OnPush をお勧めしますか?
Angular-2 プロジェクト内で常に使用するのは合理的な規則でしょうか?
コンポーネントのデコレータ内?default-strategy を使用する明確な理由がある場合を除きますか?
angular - サービスからのコンポーネント ビューの更新のトリガー - ChangeDetectorRef のプロバイダーなし
サービスからのイベントによってトリガーされるアプリケーション ビューを更新したいと思います。
私のサービスの 1 つは、ChangeDetectorRef を挿入します。コンパイルは機能しますが、アプリのブートストラップ時にブラウザーでエラーが発生します: No provider for ChangeDetectorRef!
.
AppModule に追加する必要があると思いましたが、そこにインポートできるモジュールにあることを示唆するドキュメントが見つかりません。クラス自体をインポート配列に追加しようとしましたが、エラーが発生しました。また、モジュールの providers 配列に追加しようとするとエラーが発生しました。これが私のサービスの簡略版です。
そしてアプリモジュール:
アップデート
それ以来、ChangeDetectorRef の使用を削除しようとしましたが、まだ同じ問題があります。System JS 構成の更新方法に問題があると思います。
私はもともと angular-cli でアプリを作成しましたが、Angular が更新されていないため、自分で Angular を更新しようとしていました。Angular 2.0.0 の最終リリースでは、最新バージョンの angular を使用するように angular-cli を更新しました。だから私は彼らのアップグレード手順を試してみるつもりです.うまくいくことを願っています.
更新 2
webpack/angular-cli の更新はうまくいきました。現在、Angular 2.0.0 と angular-cli 1.0.0-beta14 を使用してアプリをビルドしています。ブラウザでも同じエラーが表示されます。サービスからChangeDetectorRefを削除しようとしましたが、そうではありませんでした。私は2つのサービスでそれを持っていました。両方のサービスから削除すると、 ChangeDetectorRefを使用しようとしていた場所を除いて、アプリが正常に読み込まれ、正常に動作します。ファイルの 1 つに追加し直すと、ブラウザーはそのプロバイダーを見つけることができないと文句を言います。
モジュールにインポートしようとしましたが、モジュールではないため、トランスパイラーが文句を言います。モジュールにプロバイダーをリストしようとしましたが、提供プロパティがないため、トランスパイラーが文句を言います。宣言配列に入れようとすると、同様の問題が発生します。
angular - 入力配列の変更検出
HTTP 要求応答 (非同期) から生成されたオブジェクトの配列をコンポーネントに入力しており、最初の 3 つの配列要素だけで別の配列を埋めたいと考えています。
最初の配列が親入力から割り当てられると同時に、新しい配列を埋めたいと思います。
動作しない私のコードは次のとおりです。
セッターを使用して、入力された配列の入力プロパティの変更をインターセプトできないのはなぜですか? そして、私が望む結果を達成するための良い代替方法は何ですか?
javascript - Angular 2 リリース バージョンで特定のコンポーネントを再レンダリングする
BuilderComponent と InputTextComponent の 2 つのコンポーネントがあります。ドラッグ アンド ドロップを使用して、BuilderComponent テンプレートの sortableList 要素にディレクティブを配置しました。インスペクターを使用すると、ディレクティブが sortablelist DOM 要素に表示されることがわかります。
前回のコンパイル以降にテンプレートのコンテンツが変更されたことを BuilderComponent に強制的に検出させ、新しく追加されたディレクティブでテンプレートを再レンダリングして、新しくコンパイルされた InputTextComponent を表示するにはどうすればよいですか。
BuilderComponent:
入力テキスト コンポーネント:
何か案が?
前もって感謝します。
canvas - Angular 2: キャンバスと変更検出
canvas 要素を使用して、Angular 2 で円形のプログレス バーを作成したいと考えています。私は Angular 1 で複数のプロジェクトを行ってきましたが、Angular 2 と TypeScript はまったくの初心者です。
コンポーネントを作成し、ProgressCircle
それを注入可能にして、他のコンポーネント内で使用できるようにしました。このプログレス コンポーネントは、プログレス サークルの外観と塗りつぶし方法を決定するいくつかの属性を親コンポーネントから受け取ります。
注: このコードは古い ES5 プロジェクトから取り出しました。これは示すかもしれません。
これで問題なく動作します。ただし、progress
親コンポーネントからの入力変数はいつでも変更される可能性があります。適切なタイミングでプログレス バーの再描画をトリガーするにはどうすればよいですか?
ビューがロードされるまでプログレスバーを初期化できません (したがって ngAfterViewInit への呼び出し)。そうしないと、キャンバス要素がまだ完全に初期化されていないため、すべてファンキーに見えます。ngOnChanges ライフサイクル フックを調べましたが、ビューが読み込まれる前に最初に起動するため、役に立ちません。
私が考えていたのは、progress
入力変数を監視可能にしてから、フックでサブスクライブすることngAfterViewInit
でしたが、それがどのように機能するかは完全にはわかりません。また、フックしngOnChanges
て最初の変更かどうかを確認できると思います (実際には、SimpleChange クラスにはドキュメントによるとそのようなメソッドがあります)。
ポインタをいただければ幸いです!Angular 2 は私にとって成長しつつありますが、Angular 1/ES5 からの移行に慣れるにはかなりの時間がかかることは間違いありません。
angular - コンポーネントで変更検出がトリガーされたかどうかを確認する方法
私のアプリでは、手動の変更検出を設定したいと考えています。このために、ChangeDetectionStrategry を OnPush に設定し、コンポーネントで変更が発生するたびに、detectChanges を使用して手動で変更検出を実行します。
私の理解によれば、親コンポーネントで ChangeDetectionStrategy を OnPush に設定すると、子で ChangeDetectionStrategy を OnPush に設定しなくても、親コンポーネントで 1 回だけ、子コンポーネントで 1 回だけ変更検出が実行されます。親コンポーネントに変更がある場合は、親コンポーネントで detectChanges() を実行します。子コンポーネントに変更があれば、子コンポーネントで detectChanges() を実行します。
それは正しい方法ですか?または何か良い方法はありますか?
次に、特定のコンポーネントで期待どおりに動作し、変更検出が実行されていないかどうかを確認する方法はありますか。