7

2つ以上のレベルのコンポーネントで関数を渡す最善の方法は何ですか? '&'バインディングを使用するときに関数ラップをスキップする簡単な方法はありませんか?AngularJS 1.5の内部コンポーネント間で関数を渡す最善の方法は何ですか?

angular.module('app', []).component('app', { 
    controller: class AppController { 
    doSomething (data) {} 
    }, 
    template: ` 
    <sub-component on-do-something="$ctrl.doSomething(data)"> 
    </sub-component> 
    ` 
}) 

PS:ここ

は、ユースケースだ私はngReduxを使用していますので、このようなシナリオは非常に一般的です

EDIT:

問題がある:仕事に上記のコードのためにそれぞれの内部コンポーネントコントローラは次のようになります。

.component('subComponent', { 
    bindings: { 
     doSomething: '&' 
    }, 
    controller: function SubComponentController() { 
     this._doSomething = param => this.doSomething({data: param}); 
    }, 
    template: ` 
     <inner-component do-something="$ctrl._doSomething(data)"> 
     </inner-component> 
    ` 
}); 

.component('innerComponent', { 
    bindings: { 
     doSomething: '&' 
    }, 
    controller: function InnerComponentController() { 
     this._doSomething = param => this.doSomething({data: param}); 
    }, 
    template: ` 
     <sub-inner-component do-something="$ctrl._doSomething(data)"> 
     </sub-inner-component> 
    ` 
}); 

次に、dを渡す必要があります直接doSomethingの代わりにを所有しています。

PS:私は、あなたのサブコンポーネントのコントローラでラッパー関数を提供する必要はありません、ここで

+0

サービスを使用する:ここで

angular.module('app', []) .component('app', { controller: class AppController { doSomething (data) { console.log(data); } }, template: ' <sub-component do-something="$ctrl.doSomething(data)"> </sub-component> ' }) .component('subComponent', { bindings: { doSomething: '&' }, template: ' <inner-component do-something="$ctrl.doSomething({data: data})"> </inner-component> ' }) .component('innerComponent', { bindings: { doSomething: '&' }, template: ' <sub-inner-component do-something="$ctrl.doSomething({data: data})"> </sub-inner-component> ' }) .component('subInnerComponent', { bindings: { doSomething: '&' }, template: ' <button ng-click="$ctrl.doSomething({data: 123})">Do Something</button> ' }); 

は作業Plunkerのですか? ;-) –

+0

@DmitriZaitsev私はreduxとsmart&dumbコンポーネントのコンセプトを使用しているので、理想的なソリューションではありません:( – Hodes

+0

関数ラップの意味を説明できますか? –

答えて

18

トランスクルーを使用していませんよ。 bindingsを使用すると、機能が自動的にコントローラに接続され、テンプレートから直接呼び出すことができます。

この関数はオブジェクトを取ります。これには、外側のテンプレートの式で使用できるローカルが含まれています。

この場合、doSomething(locals)メソッドを呼び出すときは、外部テンプレートの変数dataを明示的に指定する必要があります。 http://plnkr.co/edit/QQF9jDGf6yiewCRs1EDu?p=preview

+0

うわー。 Angularが最初の '{data:123}'を親の式のローカル変数に変換する方法について考えると、少し混乱しますが、うまくいきます。私は、私が完全に理解するまで、Angularソースでもう少し掘り下げていくつもりです。ありがとう@PeteBD – Hodes

関連する問題