【问题标题】:Livewire Select2 Dynamic not updating public viewLivewire Select2 Dynamic 不更新公共视图
【发布时间】:2021-10-21 08:47:54
【问题描述】:

我正在使用带有 wire:ignore 的 select2 组件,我想在单击按钮后动态更新 select2 值。我使用事件设置了这个功能,并且事件工作正常,变量也被初始化。我无法更新此 select2 的公开视图。

我的刀

<select class="select2-example form-control" id="subjects" wire:model.lazy="subjects"  name="subjects"> 
 </select> 

@push('scripts')
<script>
$('#subjects').select2({
        maximumSelectionLength: 1,
        minimumInputLength:2,        
        tags: false,
        placeholder: 'Enter Subject(s)',
       .... // this all works great
});   

$('#subjects').on('change', function (e) {
        let data = $(this).val();
        @this.set('subjects', data);
});

// my event listener and it is working as well
Livewire.on('editSubject', subject => {
         console.log(subject);

         @this.set('subjects', subject);
         $('#subjects').val(subject);
         $('#subjects').trigger('change');   //the public view doesn't get updated
}) 
</script>
@endpush

到目前为止,我也尝试过浏览器调度事件。没有任何效果。解决方法是什么?非常感谢任何帮助。

【问题讨论】:

  • 这段代码是否包含在根 div 容器中?为什么电线:忽略?
  • @Prospero 是的。这被包裹在一个根容器中,如果我删除线:忽略 select2 的样式丢失。
  • 我将分享一个如何避免这种行为的示例

标签: laravel laravel-livewire


【解决方案1】:

注意:如果有人在实施上述解决方案时遇到实时验证问题,正如我在上面接受的答案中所评论的那样。

我的评论:

嘿,我已经实施了您的解决方案,它工作得很好,但是有 一个问题,这是场景,我提交空表单和所有 验证被触发,当我开始填写表格时出现错误 开始消失,但只要我更改 select2 验证 部分 $this-update($key, $value) 功能不起作用。请你 告诉我为什么实时验证不起作用?以及如何解决它 请。谢谢你 - Wcan

解决方案:

使用 syncInput() 函数而不是将值分配给 country 属性。更新的生命周期挂钩将自动触发。

public function setCountry($countryValue)
{
    // $this->country = $countryValue;
    $this->syncInput('country', $countryValue);
}

【讨论】:

    【解决方案2】:

    在刀片中

    <div class="col d-flex display-inline-block">
      <label for="contact_devices">{{ __('Select Device') }}</label>
      <select id="contact_devices" wire:model="selectedDevice" class="form-control contact_devices_multiple" multiple="multiple" data-placeholder="{{ __('Select') }}">
        @foreach($devices as $device)
          <option value="{{ $device->id }}">{{ $device->alias }}</option>
        @endforeach
      </select>
    </div>
    
    <script>
      window.loadContactDeviceSelect2 = () => {
        $('.contact_devices_multiple').select2({
          // any other option
        }).on('change',function () {
          livewire.emitTo('tenant.contact-component','devicesSelect',$(this).val());
        });
      }
      loadContactDeviceSelect2();
      window.livewire.on('loadContactDeviceSelect2',()=>{
        loadContactDeviceSelect2();
      });
    
    </script>
    

    在组件中

    public $selectedDevice;
    
    protected $listeners = [
      'devicesSelect'
    ];
    
    public function devicesSelect($data)
    {
       dd($data);
       $this->selectedDevice = $data;
    }
    
    public function hydrate()
    {
      $this->emit('loadContactDeviceSelect2');
    }
    

    【讨论】:

    • 非常感谢您澄清这一点。这个例子非常适合任何被这个问题困扰的人。
    • 很高兴听到这个消息!好编码!
    • 在整个互联网上搜索了这个答案,很棒的工作
    • 嘿,我已经实现了您的解决方案,它工作得很好,但有一个问题,这是场景,我提交空表单并触发所有验证,当我开始填写表单时,错误开始消失,但一旦我更改 select2 验证部分 $this-update($key, $value) 功能不起作用。你能告诉我为什么实时验证不起作用吗?以及如何解决它。谢谢你
    • 我在下面找到并给出了我的问题的答案。
    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2021-09-20
    • 2021-05-27
    • 2021-07-13
    • 2023-01-30
    • 2020-12-16
    相关资源
    最近更新 更多