誰かが既にNG-IFを使用して言及し、可能であればそのまたは非同期入力にあなたの子コンポーネントは、より寛大な作りは、常により良いアプローチですが、あなたがすることができる多くのものがあります。
1 - あなたはいつものようにシグネチャを持つシンプルなイベントサービスを作成し、イベンティングを使用することができます - 暗い子でハンドラを登録し、とき
2準備ができて、親からのイベントを発生さ
service.registerEventHandler(id, function)
service.unregisterEventHandler(id, function)
service.sendEvent(id)
2ウェイバインディングを使用した魔法子コンポーネントで は、ポストリンクは後にサイクルを消化した後...あなたは、子に定義された関数を実行するためにthis.placeholder();
を呼び出すことができ、後にコンパイル、親コントローラに<child data-dark-magic="$ctrl.placeholder">....
そして、親テンプレートから次に
bindings: {
darkMagic: '='
},
controller: function() {
this.$onInit = function() {
darkMagic = function() {
// data ready
};
...
を指定します。
3 - あなたはその後、親からあなたが<child is-ready-property="$ctrl.imready">...
を持っており、データがロードされたときにちょうどコントローラでtrueにimready切り替え状態
controller: function() {
this.ready = false; // should use onInit but saving lines
this.$onchanges = function(changesObj) {
if (changesObj.isReadyProperty) {
this.ready = changesObj.isReadyProperty.currentValue;
}
}
},
bindings: {
isReadyProperty: '<',
}
を切り替えることonChangesと結合一方向を使用することができます。
子が親の下に常にあるとき、この良い例は、タブセットコンポーネントおよびタブコンポーネントである場合もあります。この場合、子(タブ)コンポーネントはタブセットコントローラを必要とし、そこで定義されたAPIを使用することができます。
また、通信にサービスを使用して、両方のコンポーネントにサービスを注入し、そのように状態を維持することもできます。ファクトリパターンを使用し、角度レシピで状態を維持することはできませんが、このソリューションには注意してください。
さらに多くの方法があると確信していますが、実際はあなたのユースケースによって異なります。
何かを受け取るまで、ノーデータの場合を適切に処理するために、コンポーネントをより寛大にする方が良いです。
乾杯
あなたが代わりに '$のOnInitを(使用する呼び出すことができる機能を公開するためにコンポーネントを書き換える可能性が)'が、コンポーネント自体を初期化することができないの全体的なアイデアは、の設計に関する原則に反していますコンポーネント。基本的には、コンポーネントが親アプリの状態から独立して動作できない場合、これはコンポーネントまたはアプリケーションの設計が悪いことの兆候です。 – Claies
そうすることは悪い習慣です。しかしそれは達成することができます。単方向バインディングにプロパティとしてinit関数を追加し、外部から呼び出すことができます(これはお勧めしません)。別のアプローチは、$ onChangesリスナーを追加し、コンポーネントを実際に初期化するときに外部からバインディングを設定することです。まだ悪いですが、少し悪くはないと感じています。 – konqi
Claies、私は理解しています、あなたは見たことがないデザインを裁くことに急いでいます。他の誰かによって構築されたコンポーネントidのほかに、私はそうではありません。プロビジョニングを介してコントローラにロードされたデータに基づいてコンポーネントがロードされる必要があります(遅延が発生する)。これは技術的には不明ですが、コンポーネントは既に初期化されています。あなたはそれをどのように扱いますか? – monstro