事后在AlpineJS中刷新数据

时间:2020-08-03 16:41:48

标签: alpine.js

我正在使用Alpine显示将更改的项目列表。但是我不知道一旦服务器返回新的项目,如何告诉Alpine刷新项目列表:

<div x-data=" items() ">
    <template x-for=" item in items " :key=" item ">
        <div x-text=" item.name "></div>
    </template>
</div>

项目的第一个“批次”很好,因为它们是在items()函数中硬编码的:

    function items(){
        return {
            items: [
                { name: 'aaron'  },
                { name: 'becky'  },
                { name: 'claude' },
                { name: 'david'  }
            ]
        };
    }

Alpine以外的某些代码获取并接收一个全新的项目列表,我要显示这些列表而不是原始集合。我不知道怎么办,或者目前是否可行。感谢您的指导。

1 个答案:

答案 0 :(得分:8)

有3种解决方法。

  1. 将提取的内容移至Alpine.js上下文中,以便可以更新this.items
  function items(){
        return {
            items: [
                { name: 'aaron'  },
                { name: 'becky'  },
                { name: 'claude' },
                { name: 'david'  }
            ],
            updateItems() {
              // something, likely using fetch('/your-data-url').then((res) => )
              this.items = newItems;
            }
        };
    }
  1. (不推荐),从您的JavaScript代码中访问rootElement.__x.$data并设置__x.$data.items = someValue
<script>
  // some other script on the page
  // using querySelector assumes there's only 1 Alpine component
  document.querySelector('[x-data]').__x.$data.items = [];
</script>
  1. 从您的JavaScript中触发一个事件,并从您的Alpine.js组件中监听它。

更新为Alpine.js组件,请注意x-on:items-load.window="items = $event.detail.items"

<div x-data=" items() " x-on:items-load.window="items = $event.detail.items">
    <template x-for=" item in items " :key=" item ">
        <div x-text=" item.name "></div>
    </template>
</div>

触发自定义事件的代码,您需要填写有效载荷。

<script>
let event = new CustomEvent("items-load", {
  detail: {
    items: []
  }
});
window.dispatchEvent(event);
</script>