我有一個ractive組件需要執行一個特定的功能,當用戶要求。也就是說,不是在組件初始化時,而是在一段時間之後。從父級調用子組件中的函數的最佳方法?
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',因爲事件源於根,不會被命名空間。如果它可能來自子組件,那麼星型偵聽器會捕獲它,因爲事件在第一次跨越組件邊界(氣泡到其直接父級)時會增長名稱空間。用空格分隔多個名稱只是訂閱多個事件的簡寫。 –
你能否更新你的例子以符合你的評論?這會讓它更清晰一些。你也可以使用addEventListener()來進行事件綁定,而不是使用HTML嗎? – mikemaccana