2つ以上のレベルのコンポーネントを介して関数を渡すのに最適な方法は何ですか? 「&」バインディングを使用するときに関数のラップをスキップする簡単な方法はありませんか?
これがユースケースです:
angular.module('app', []).component('app', {
controller: class AppController {
doSomething (data) {}
},
template: `
<sub-component on-do-something="$ctrl.doSomething(data)">
</sub-component>
`
})
pS:私はngReduxを使用しているので、そのようなシナリオは非常に一般的です
編集:
問題は、上記のコードが機能するために、各内部コンポーネントコントローラは次のようになることです。
.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>
`
});
そして、私は_doSomething
の代わりにdoSomething
を直接使用します。
ps:ここではトランスクルージョンを使用していません
サブコンポーネントのコントローラーにラッパー関数を提供する必要はありません。 bindings
を使用することにより、関数がコントローラーに自動的にアタッチされ、テンプレートから直接呼び出すことができます。
唯一の問題は、この関数がオブジェクトを取ることです。このオブジェクトには、外部テンプレートの式で使用できるようになるローカルが含まれています。
この場合、doSomething(locals)
メソッドを呼び出すときに、外部テンプレートのdata
変数を明示的に指定する必要があります。
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です: http://plnkr.co/edit/QQF9jDGf6yiewCRs1EDu?p=preview