开发者问题收集

Laravel Livewire Select2 多重选择问题

2021-08-07
1722

产品变体颜色第一次被禁用,启用后可以选择颜色。 没有 wire:ignore ,选择颜色后它会从选择选项中消失。

如果我使用 wire:ignore

{{ $colors_active== 0 ?'disabled':'' }}

禁用未被删除,它仍然被禁用。

在此处输入图像描述

product.blade.php

<div class="row g-3 align-center">
    <div class="col-lg-3">
        <div class="form-group">
            <input class="form-control" type="text" value="Colors" readonly>
        </div>
    </div>
    <div class="col-lg-8">
        <div class="form-group">
            <select class="form-control color-select2"  multiple style="width: 100%" {{ $colors_active== 0 ?'disabled':'' }} >
                @foreach (App\Models\Admin\Color::orderBy('name', 'asc')->get() as $key => $color)
                    <option value="{{$color->code}}">
                        {{$color->name}}
                    </option>
                @endforeach
            </select>
        </div>
    </div>

    <div class="col-lg-1">
        <div class="form-group">
            <div class="form-control-wrap">
                <label class="c-switch c-switch-pill c-switch-opposite-success">
                    <input wire:model="colors_active" class="c-switch-input" type="checkbox" value="1" ><span class="c-switch-slider"></span>
                </label>
            </div>
        </div>
    </div>
</div>

Product.php 组件

{

    public $colors_active;
    public $choice_attributes = [];
    public $colors = [];


    public function mount(){

    }

    public function render()
    {
        return view('livewire.admin.product.product')->layout('admin.layouts.master');
    }
}
2个回答

Livewire 将忽略任何标有 wire:ignore 的内容的更改,因此当它被忽略时,它自然不会重新渲染任何内容。

您可以使用 Apline.js 解决此问题,并将 $colors_active 属性与 Alpine.js 中的属性纠缠在一起。纠缠意味着当 Livewire 在其后端更新变量时,Alpine 也会更新其变量 - 反之亦然(当变量发生变化时,Alpine.js 会更新 Livewire)。基本上,两者之间保持同步。

然后,您可以让 Alpine.js 根据该变量动态绑定 select 元素的 disabled 属性。

<div x-data="{ 'colorsActive': @entangle('colors_active') }">
    <select 
        class="form-control color-select2"  
        multiple 
        style="width: 100%" 
        wire:ignore
        x-bind:disabled="colorsActive == 0"
    >
        @foreach (App\Models\Admin\Color::orderBy('name', 'asc')->get() as $key => $color)
            <option value="{{ $color->code }}">
                {{ $color->name }}
            </option>
        @endforeach
    </select>
</div>
Qirel
2021-08-07

这是我使用 Livewire 解决此类问题的方法,没有使用 Alpine,因为不幸的是我还没有学过它。 在 blade 组件中:

<div class="col d-flex display-inline-block">
  <label>Device</label>
  <select {{ $customer ? '' : 'disabled' }} wire:model="selectedItem" class="form-control contact_devices_multiple" multiple="multiple" data-placeholder="Select" style="width: 100%;">
    @foreach($devices as $device)
       <option value="{{ $device->id }}">{{ $device->alias }}</option>
    @endforeach
  </select>
</div>

<script>
window.loadContactDeviceSelect2 = () => {
  $('.contact_devices_multiple').select2().on('change',function () {
    livewire.emitTo('contact-component','selectedItemChange',$(this).val());
  });
}
loadContactDeviceSelect2();
window.livewire.on('loadContactDeviceSelect2',()=>{
   loadContactDeviceSelect2();
});
</script>

在组件中

public $customer = null;
public $selectedItem = [];
public function hydrate()
{
    $this->emit('loadContactDeviceSelect2');
}
public $listeners = [
   'selectedItemChange',
];

public function selectedItemChange($value)
{
   dd($value);
}
Prospero
2021-08-08