私は、ユーザーがそれを尋ねたときに特定の機能を実行する必要のある欲求不満なコンポーネントを持っています。つまり、コンポーネントが初期化されているときではなく、後である場合があります。親コンポーネントから子コンポーネント内の関数を呼び出す最も良い方法は?
ractive docs mention events are used to communicate between components and their parentsただし、子から親にバブリングするイベントのコンテキストでのみ。この場合、親は子に対して何かを呼び出さなければなりません。
また、ractive.findComponent()がありますが、例は親から子への通信にはあまり使用されていないようです。
私はFindComponent指定()と作品を使用して、次のスニペットを作りました(「ファイル名を指定して実行コードスニペット」をクリックしその後、「フルページ」)。しかし、私はそれが最適だかわからない:
var coolWidget = Ractive.extend({
data: {},
template: `<span>Your favorite fruit is {{ fruit }}</span>`,
data: function(){
return {
fruit: 'banana',
doCoolThing: function(){
var component = this;
console.log('Going to change fruit...')
setTimeout(function(){
component.set('fruit', 'avocado')
}, 3 * 1000)
}
}
}
})
var ui = new Ractive({
el: '.some-ui',
data: { name: 'Mike'},
components: {
coolWidget
},
template: `
<h1>Hello {{ name}}</h1>
<button>Press me</button>
<coolWidget />
`,
oncomplete: function(){
var widget = this.findComponent('coolWidget')
document.querySelector('button').addEventListener('click', function(){
widget.get('doCoolThing')();
})
}
})
<script src="http://cdn.ractivejs.org/latest/ractive.js"></script>
<div class="some-ui">
</div>
親から子コンポーネント内の関数を呼び出すの最良の方法は何ですか?
ありがとう:
はここで一緒に全体のことです! '' doCoolThing * .doCoolThing''は正しいですか? 'coolWidget doCoolThing'のようなものではないでしょうか? – mikemaccana
@mikemaccanaこの特定のケースでは、イベントがルートから発信されており、名前空間を持たないため、 '* .doCoolThing'を削除できます。子コンポーネントから来る可能性がある場合、イベントはコンポーネント境界を最初に通過するときにイベントが名前空間に成長するため、スター・リスナーはそれを捕捉します(直接の親へのバブル)。スペースで区切られた複数の名前を持つことは、複数のイベントを購読している場合の省略形に過ぎません。 –
あなたのコメントにマッチするあなたのサンプルを更新できますか?それは少し明確になります。また、HTMLではなくaddEventListener()でイベントバインディングを行うことができますか? – mikemaccana