Строка, возвращаемая вашим пользовательским форматером, будет обрабатываться как "нормальная" HTML, поэтому синтаксис Svelte больше не доступен ... А именно on:click
является синтаксисом Svelte и не будет обрабатываться браузером.
Я не эксперт по пользовательским элементам, но, к сожалению, по мнению других , то, что вы пытаетесь сделать, невозможно. То есть вы не можете зарегистрировать прослушиватели пользовательских событий только на пользовательских элементах HTML. Вам обязательно придется сделать это с JS. Примерно так:
<script>
document.querySelector('custom-button')
.addEventListener('my-event', e => {
console.log(e.detail)
})
</script>
Кроме того, имейте в виду, что события от пользовательских элементов в Svelte в настоящее время имеют некоторые ограничения (см. эту проблему ).
Итак, чтобы иметь собственные события для ваших пользовательских элементов, вам придется использовать какой-то обходной путь. Например, вот компонент, который запускает прослушиватель в приведенном выше фрагменте кода:
<svelte:options tag="custom-button" />
<script>
import { onMount } from 'svelte';
let el
onMount(() => {
const interval = setInterval(() => {
let event = new CustomEvent('my-event', {
detail: {time: Date.now()},
bubbles: true,
composed: true, // needed for the event to traverse beyond shadow dom
})
el.dispatchEvent(event)
}, 1000)
return () => {
clearInterval(interval)
}
})
</script>
<button bind:this={el}><slot /></button>
Обратите внимание, что такой код будет иметь ограниченную поддержку со старыми браузерами.
Все это, как говорится, только для точно так же, как в вашем примере, вы, очевидно, могли бы заставить его работать, зарегистрировав свое событие в собственном браузере onclick
вместо Svelte on:click
. Я все еще не эксперт по CE, но я предполагаю, что браузер обрабатывает стандартные события, которые доступны для всех встроенных элементов, таких как нажатие или нажатие клавиши на элементах CE тоже ...
Итак, похоже, это должно работать для вас :
return '<ul class="actions_row"><li><custom-button onclick="handleClick">Edit</custom-button></li></ul>';
Примечание: onclick="handleClick"
вместо on:click={handleClick}
. Теперь вы находитесь в стандартной браузерной стране, поэтому применяются обычные правила, так же, как если бы вы использовали обычный <button>
... handleClick
, который должен быть доступен в области видимости, и т. Д. c.