我有一个模型,我用阿尔卑斯山js显示或隐藏. 当我按下一个按钮时,我会选中一个布尔值,如果是真的,我想关闭该模式,为此,我必须与Alpines的数据交互. 有没有办法从JS调用Alphines的函数?

我try 使用自定义事件,但似乎不起作用

let event = new CustomEvent("closeModal", {}); window.dispatchEvent(event)

然后在通道的目录中 x-show="isOpen()" @closeModal.window="close"

编辑:
多亏了pthomson回答,我能够让它工作,我还找到了一种不使用事件的方法

<div x-data>
    <button type="button" @click="$store.modal.open()">Open Modal</button>
    <div x-show="$store.modal.isOpen()">
        //Modal content
    </div>
</div>

<script>
    document.addEventListener('alpine:init', () => { 
        Alpine.store('modal', {
            show:false,
            isOpen() {
                return this.show;
            },
            open(){
                this.show=true;
            },
            close(){
                this.show =false;
            }
        })
    })

    function closeModal(){
        Alpine.store("modal").close();
    }
</script>

推荐答案

我用一个高山store 值和一个定制事件(在document上,但如果你想的话,它也可以冒泡到window)来做这件事.alpine:init事件正在注册两个文档侦听器. 您的按钮将调度这个closemodal事件(在本例中,按下逸出键还隐藏了模式). 我在div上有style="display: none",以便在页面加载期间调用alpine:init之前将其隐藏起来.也许div上的x-cloak会达到同样的期望(最初隐藏)效果. 注意:我在所有需要模式功能的页面上都包含了这个单一的模式部分.因此,它最终是一个所有页面都共享的单个AlMountain Store变量,因为它们在页面标记中都共享相同的模式部分视图.

<script>
        document.addEventListener('alpine:init', () => {
            Alpine.store('openmodal', false);

        document.addEventListener('openmodal', () => {
           Alpine.store('openmodal', true);
        })
        document.addEventListener('closemodal', () => {
           Alpine.store('openmodal', false);
           // clear modal content here if you want
        })
    });
</script>

<div
        x-show="$store.openmodal"
        style="display: none"
        x-on:keydown.escape.prevent.stop="$dispatch('closemodal');"
        role="dialog"
        aria-modal="true"
        class="fixed inset-0 overflow-y-auto"
    >
.. modal content
</div>

然后在其他地方你有你的纽扣

<button onclick="$dispatch('closemodal');">close</button>

编辑:根据你的反馈,还有其他方法可以实现你想要做的事情……不确定isOpen()函数如何获得正确的返回值,但是您的div可以只监听该按钮以引发定制的闭合 node 事件.例如,调用isOpen函数并传入状态,但您得到的 idea 是?<div x-on:closemodal.window="isOpen(false)">基本上与您所要求的相反:阿尔卑斯山侦听来自Java脚本的调用.

Javascript相关问答推荐

如何使用Echart 5.5.0创建箱形图

没有输出到带有chrome.Devtools扩展的控制台

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

Chromium会将URL与JS一起传递到V8吗?

使用Java脚本根据按下的按钮更改S文本

无法检测卡片重叠状态的问题

无法读取未定义错误的属性路径名''

提交链接到AJAX数据结果的表单

单个HTML中的多个HTML文件

第二次更新文本输入字段后,Reaction崩溃

将多个文本框中的输出合并到一个文本框中

输入的值的类型脚本array.排序()

AG-GRIDreact 显示布尔值而不是复选框

是否设置以JavaScript为背景的画布元素?

Chrome上的印度时区名S有问题吗?

如何向内部有文本输入字段的HTML表添加行?

如何将对象推送到firestore数组?

将字符串解释为数字;将其重新编码为另一个基数

Google OAuth 2.0库和跨域开放程序的问题-策略错误

Js问题:有没有办法将数据从标记表转换成图表?