我尝试将应用程序包装到“存储库”组件中,并且外部组件应处理与后端的所有通信,例如加载,更新,删除可编辑数据。我以为我可以将事件发送到该Repository
组件,但是我做不到这种方式。有谁发现问题或可以解释,为什么这不起作用以及如何通过事件正确解决?我可以改写可写对象,但是事件会使它更具可读性。这是一个简化的示例和一个精巧的REPL链接:
https://svelte.dev/repl/e1eae56c7d5e48b2a99299f1bc1bf970?version=3.22.3
App.svelte:
<script>
import Repository from './Repository.svelte'
import Application from './Application.svelte'
</script>
<Repository>
<Application on:save={() => console.log('caught in App')} />
</Repository>
Repository.svelte:
<div on:save={() => console.log('caught in Repository')}>
<slot></slot>
</div>
Application.svelte:
<script>
import {createEventDispatcher} from 'svelte'
const dispatch = createEventDispatcher();
function saveHandler() {
console.log('dispatching')
dispatch('save')
}
</script>
<button on:click={saveHandler}>
Save
</button>
所需的输出将是
dispatching
caught in Repository
但仅打印
dispatching
caught in App
单击按钮时。
答案 0 :(得分:0)
找到了至少一个解决方案,let
指令可以提供帮助,尽管它不是纯粹的事件而且很冗长。
https://svelte.dev/repl/a03214d522cd4bcba67f86c426a3b28d?version=3.22.3
App.svelte:
<script>
import Repository from './Repository.svelte'
import Application from './Application.svelte'
</script>
<Repository let:saveHandler={saveHandler}>
<Application on:save={saveHandler} />
</Repository>
Repository.svelte:
<script>
function saveHandler() {
console.log('caught in Repository')
}
</script>
<div>
<slot {saveHandler}></slot>
</div>
Application.svelte:
<script>
import {createEventDispatcher} from 'svelte'
const dispatch = createEventDispatcher();
function saveHandler() {
console.log('dispatching')
dispatch('save')
}
</script>
<button on:click={saveHandler}>
Save
</button>
缺点(或优点)是,我们必须在主组件上使用let
指令公开存储库中的所有方法,并在该组件中捕获事件,这可能会导致许多不必要的事件转发(因为事件只能冒一个级别。