Запуск событий из компонента svelte и прослушивание его со страницы содержания
У меня есть этот код в моем компоненте, который по сути такой же, как пример в документации svelte:
export default {
methods: {
assessmentMouseover(e) {
const event = new CustomEvent('assessment-mouseover', {
detail: 'something',
bubbles: true,
cancelable: true,
composed: true, // makes the event jump shadow DOM boundary
})
this.dispatchEvent(event)
},
},
...
}
Затем у меня есть этот код в теге script HTML-страницы, который создает экземпляр этого компонента, который, по сути, такой же, как документ svelte:
const el = document.querySelector('#radar')
el.addEventListener('assessment-mouseover', event => {
console.log('got here')
})
Однако, когда я запускаю событие, я получаю эту ошибку: this.dispatchEvent is not a function
,
Я пробовал несколько вариантов this.dispatchEvent()
как просто dispatchEvent()
, который не ошибается, но и не вызывает слушателя; а также window.dispatchEvent()
который также не в состоянии вызвать.
Что я делаю неправильно?
1 ответ
Решение
Репл. Рабочего случая: https://svelte.technology/repl?version=2.15.3&gist=7b0b820ce452cf6d5d10ebf456627651
test.html:
<button id="{id}" on:mouseover="doMouseOver(event)">
{isOver}
</button>
<script>
export default {
data() {
return {
isOver: 'Over Me!'
}
},
methods: {
doMouseOver(e) {
const event = new CustomEvent('assessment-mouseover', {
detail: Math.random(),
bubbles: true,
cancelable: true,
composed: true, // makes the event jump shadow DOM boundary
})
//this.dispatchEvent(event)
let source = e.target || e.srcElement
source.dispatchEvent(event)
}
}
}
</script>
App.html:
<h1>From Test: {text}</h1>
<Test id="radar"/>
<script>
export default {
components: {
Test: './Test.html'
},
data() {
return {
text: 'Wait for over'
}
},
oncreate() {
const el = document.querySelector('#radar')
el.addEventListener('assessment-mouseover', event => {
this.set({text: event.detail})
})
},
}
</script>