Alpine.js:如何从外部文件中的函数访问 x 数据?

Eig*_*ght 1 javascript alpine.js

我刚刚开始使用 Alpine.js,我了解基础知识,但在将函数移到内联脚本标记之外时应用它们时遇到困难。

例如,在index.html

<div x-data="{ loading: false }"/>
  <button
    onClick="post()"
    :class="{ 'active': loading === true }"
  >
    Post Comment
  </button>
</div>
Run Code Online (Sandbox Code Playgroud)

如果post()main.ts

const postComment = () => {
  this.loading = true;
};

window.postComment = postComment;
Run Code Online (Sandbox Code Playgroud)

我怎样才能使它this不是未定义的?

我发现了很多函数保存在 中的示例index.html,但没有发现它们位于单独的文件中。

Ste*_*e O 9

您需要将该方法添加到 AlpineJs 实例才能访问相同的范围。但是您可以使用扩展...运算符通过一些对象解构来做到这一点:

在页面中:

<div x-data="{
  isLoading: false,
  ...utils
}">
    // Your content
</div>
Run Code Online (Sandbox Code Playgroud)

然后在您的外部脚本文件中:

const utils = {
  post(){
    this.isLoading = true
  }
}

window.utils = utils
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,您可以将加载指示器所需的所有内容放入此外部对象中,以便在您需要的任何地方用作 mixin。

这是一个工作示例:https ://codepen.io/stephenoldham/pen/BapvyYr


AlpineJs v3 更新:

如果您试图在最新版本的 AlpineJs 中实现相同的目标,您将需要使用数据指令:

在页面中:

<div x-data="utils">
    // Your content
</div>
Run Code Online (Sandbox Code Playgroud)

然后在您的外部脚本文件中:

document.addEventListener('alpine:init', () => {
    Alpine.data('utils', () => ({
        isLoading: false,
        post(){
            this.isLoading = true

            setTimeout(() => {
                this.isLoading = false
            }, 3000)
        }
    }))
})
Run Code Online (Sandbox Code Playgroud)

这是一个有效的示例: https://codepen.io/stephenoldham-the-vuer/pen/dyJEjRx ?editors=1100

文档中的进一步阅读涵盖了如何设置初始值等: https: //alpinejs.dev/globals/alpine-data

  • 在使用 AlpineJS + Laravel 9 + Blade 模板大约 20 个小时的痛苦之后,这个简单的运算符终于给了我一个可行的解决方案。如果有人处于这个位置,那么只需使用 {{ }} 语法将实例数据传递到 x-data 定义(其中 Steve 写为 false),然后您可以在外部函数中访问它,以使用 axios 发出 ajax 请求或者 fetch()...或者做任何你使用 Alpine 做的事情。Laravel Mix 随 Alpine 开箱即用,因此我使用它。如果有人正在寻找相同的解决方案并遇到史蒂夫的这个答案,我希望这会有所帮助。 (2认同)