2016-11-17 12 views
0

は、私はコンポーネントコントローラからAngularJS 1.5コンポーネントのメソッドを呼び出しますか?

コンポーネントは$のOnInit()イベントがあります...コンポーネントはRsDropdownController、通常のものを基準としたRsDropdownComponentクラスとして定義され、この

<rs-dropdown></rs-dropdown> 

ように私のメインページに差し込まれていますデータストアを呼び出してコンポーネントにデータを取り込むハンドラです。このイベントは、コンポーネントが初期化されると起動されます。

問題は、コンポーネントがonInit()イベントのロードを開始しないようにすることです。

私がしたいときに私のコントローラからコンポーネントのメソッドを呼び出せます。

基本的には、私のコントローラからComponentのインスタンスにアクセスして、ロード機能を呼び出す必要があります。

それは可能ですか?

+2

あなたが代わりに '$のOnInitを(使用する呼び出すことができる機能を公開するためにコンポーネントを書き換える可能性が)'が、コンポーネント自体を初期化することができないの全体的なアイデアは、の設計に関する原則に反していますコンポーネント。基本的には、コンポーネントが親アプリの状態から独立して動作できない場合、これはコンポーネントまたはアプリケーションの設計が悪いことの兆候です。 – Claies

+1

そうすることは悪い習慣です。しかしそれは達成することができます。単方向バインディングにプロパティとしてinit関数を追加し、外部から呼び出すことができます(これはお勧めしません)。別のアプローチは、$ onChangesリスナーを追加し、コンポーネントを実際に初期化するときに外部からバインディングを設定することです。まだ悪いですが、少し悪くはないと感じています。 – konqi

+0

Claies、私は理解しています、あなたは見たことがないデザインを裁くことに急いでいます。他の誰かによって構築されたコンポーネントidのほかに、私はそうではありません。プロビジョニングを介してコントローラにロードされたデータに基づいてコンポーネントがロードされる必要があります(遅延が発生する)。これは技術的には不明ですが、コンポーネントは既に初期化されています。あなたはそれをどのように扱いますか? – monstro

答えて

0

あなたには、いくつかのベンダーのコンポーネントを使用する場合、通常はこれが行われ、あなたがあればNGを、常に使用することができ、すべての1.First:私たちは、このトリガーを使用してください

<rs-dropdown ng-if="loadDropdown"></rs-dropdown> 
<div> smth? here or mb another component </div> 

2.In現在のプロジェクト:

<rs-dropdown load-data="loadDataTrigger"></rs-dropdown> 

3.もちろん、角度イベントを追加することができます。それほどフレキシブルではありません。

+0

そのようなものです。 「負荷データ」とは何ですか?負荷データがどのようにトリガされるのですか?コントローラにはvmがあり、vm.dataはコントローラに非同期にロードされるデータです。すでに作成され、初期化され、破壊されていますが、vm.dataが読み込まれたときにコンポーネントに何かロードするように指示するのですか? – monstro

+0

私は彼が私が以下に述べた "ダークマジック"について話していると思います。それは実際には:https://plnkr.co/edit/nySL4OoMpJPkGXX8j78U?p=preview 基本的には、親は何もトリガーへの参照を渡しますが、双方向バインディングの仕組みのために、一度ch ildは$ onInitでそれを定義していますが、同じ関数が親でも更新されているので、親によって(ボタンng-clickのように)使用できます。 – Brian

1

誰かが既に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を使用することができます。

また、通信にサービスを使用して、両方のコンポーネントにサービスを注入し、そのように状態を維持することもできます。ファクトリパターンを使用し、角度レシピで状態を維持することはできませんが、このソリューションには注意してください。

さらに多くの方法があると確信していますが、実際はあなたのユースケースによって異なります。

何かを受け取るまで、ノーデータの場合を適切に処理するために、コンポーネントをより寛大にする方が良いです。

乾杯

関連する問題