1 回答

TA贡献1796条经验 获得超4个赞
好的,所以你的问题是你items在监听事件的回调中创建变量window.onload。AlpineJs 将在事件触发和定义变量之前已经加载并尝试解析 DOM,包括您的变量。
我们可以通过在 Alpine 组件的属性中console.log添加一个来查看加载顺序:x-init
<div x-data="{}" x-init="console.log('init')"></div>
<script>
window.onload = () => {
console.log('loaded')
}
</script>
有了这个,这就是我们在开发工具中得到的(工作示例https://jsfiddle.net/hfm7p2a6/):
解决方案
解决这个问题有点取决于你需要做什么items
。如果没有加载动态内容(即您不需要执行 ajax 调用来获取数组的内容),那么只需忘记并将onload
变量放在脚本文件的顶层(工作示例https:// jsfiddle.net/nms7v4xh/):
// external.js
var items = ['your', 'items', 'array'];
// No window.onload needed
如果您确实需要那里有动态内容,则需要将其注入 AlpineJs 实例。在这里执行此操作的最佳方法可能是通过自定义事件(工作示例https://jsfiddle.net/6dLwqn4g/1/):
<div id="app" x-data="{items: null}" @my-event.window="items = $event.detail.items"></div>
<script>
// Create and dispatch the event
let event = new CustomEvent('my-event', {
detail: {
items: ['your', 'dynamic', 'items', 'content']
}
});
window.dispatchEvent(event);
</script>
@my-event.window在这里,我们使用 AlpineJs 来使用属性(您也可以使用)来侦听窗口上的事件x-on:my-event.window。然后我们可以通过$event.detail属性获得项目数据。
添加回答
举报