Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AlpineJS使用x-model触发本机JS事件(woocommerce购物车)_Woocommerce_Alpine.js - Fatal编程技术网

AlpineJS使用x-model触发本机JS事件(woocommerce购物车)

AlpineJS使用x-model触发本机JS事件(woocommerce购物车),woocommerce,alpine.js,Woocommerce,Alpine.js,尝试在电子商务结帐中使用AlpineJS。我有带+-指示器的输入数字字段以增加值,simplefield代码: <div x-data="{ qty: 1 }"> <i @click="qty = qty > 2 ? qty - 1 : 1" class="icon-left-open"></i> <input type="number" x-model=&q

尝试在电子商务结帐中使用AlpineJS。我有带+-指示器的输入数字字段以增加值,simplefield代码:

<div x-data="{ qty: 1 }">
  <i @click="qty = qty > 2 ? qty - 1 : 1" class="icon-left-open"></i>

  <input type="number" x-model="qty">

  <i @click="qty = qty + 1" class="icon-right-open"></i>
</div>

所以问题是,当输入值更改时,“更新购物车”按钮仍处于禁用状态。我认为这是因为x-model和双向绑定不会触发本机更改/输入事件

如何告诉woocommerce该值已更改?

您可以使用$watch“监视”x数据变量

您可以在此处找到有关$watch的更多信息:

例如,它监视“qty”值,如果更改,它将发送“qty\U true”事件

这是一个带有$watch和“qty\u true”事件侦听器的代码版本

<div x-data="{ qty: 1 }" x-init="$watch('qty',value => { if (value) $dispatch('qty_true'); })">
    <i @click="qty = qty > 2 ? qty - 1 : 1" class="icon-left-open"></i>
        
    <input type="number" x-model="qty">
        
    <i @click="qty = qty + 1" class="icon-right-open"></i>
</div>

<script type="text/javascript">
    window.addEventListener( 'qty_true', ( e ) => {
        console.log( 'qty now evaluates to true' );
        // enable your button here
    } );
</script>

window.addEventListener('qty\u true',(e)=>{
log('qty now求值为true');
//在此处启用您的按钮
} );

正如@Craig E所指出的,我们需要使用x-init和$watch,但这只是工作的一半,我们还需要将输入更改通知Woocmercec。一种方法是使用这一内衬:

x-init="$watch('qty', () => $refs.qty_input.dispatchEvent(new Event('change', { bubbles: true })))"
我们还应该在目标元素上添加$ref:

x-ref="qty_input"
完整代码:

<div 
  x-data="{ qty: 1 }" 
  x-init="$watch('qty', () => $refs.qty_input.dispatchEvent(new Event('change', { bubbles: true })))">
  <i @click="qty = qty > 2 ? qty - 1 : 1" class="icon-left-open"></i>

  <input type="number" x-ref="qty_input" x-model="qty">

  <i @click="qty = qty + 1" class="icon-right-open"></i>
</div>

<div 
  x-data="{ qty: 1 }" 
  x-init="$watch('qty', () => $refs.qty_input.dispatchEvent(new Event('change', { bubbles: true })))">
  <i @click="qty = qty > 2 ? qty - 1 : 1" class="icon-left-open"></i>

  <input type="number" x-ref="qty_input" x-model="qty">

  <i @click="qty = qty + 1" class="icon-right-open"></i>
</div>