如何通过htmx的hx-vals提交Alpine.js的x-data数据?
解决Alpine x-data与htmx hx-vals数据传递问题
问题原因
你用Alpine.$data('checkboxHandler')获取实例的方式是错误的,Alpine.$data()方法需要传入具体的DOM元素,而非组件的注册名称,所以返回值为null,自然访问checkedValues.length会触发"null类型不存在length属性"的报错。
解决方案
方案1:通过DOM选择器定位x-data所在元素
先给绑定了x-data="checkboxHandler"的父级div添加一个id,比如checkbox-container,再在hx-vals里通过选择器获取该元素,进而拿到Alpine实例:
<!-- 给父级div添加id --> <div x-data="checkboxHandler" id="checkbox-container"> <!-- 其他内容(如复选框等) --> <input type="button" value="Submit" hx-get='/example' hx-target="#hx_modal_container" hx-vals='js:{"total": Alpine.$data(document.querySelector("#checkbox-container")).checkedValues.length}' /> </div>
方案2:将按钮放入x-data父容器内,直接用this访问属性
如果可以把提交按钮放到x-data的父容器内部,就能直接用this访问实例属性,写法更简洁:
<div x-data="checkboxHandler"> <!-- 其他内容(如复选框等) --> <input type="button" value="Submit" hx-get='/example' hx-target="#hx_modal_container" hx-vals='js:{"total": this.checkedValues.length}' /> </div>
方案3:用Alpine的$refs标记父容器
给父级div添加x-ref属性,通过Alpine.$refs直接获取实例:
<div x-data="checkboxHandler" x-ref="checkboxHandler"> <!-- 其他内容(如复选框等) --> <input type="button" value="Submit" hx-get='/example' hx-target="#hx_modal_container" hx-vals='js:{"total": Alpine.$refs.checkboxHandler.__x.$data.checkedValues.length}' /> </div>
另外,你的x-data代码里的total()方法存在小问题,缺少return语句,建议修正为:
total(){ return this.checkedValues.length },
内容的提问来源于stack exchange,提问作者yalow
相关产品推荐
相关产品推荐

