Livewire 不发送 select2 变量
Livewire doesn't sent select2 variable
我创建了一个 livewire 组件,我在其中创建了一个带有普通输入的表单和多个 select 和 select2。我填写了字段并 select 在 select 中编辑了必要的选项,所有变量(来自默认输入和默认 select)都被发送,除了 select2.
通过ddd();它表明它们是 []。通过控制台,我可以看到除了 select 和 select2 之外的所有变量都已发送。
可能是什么问题?
<div>
<form wire:submit.prevent="createPerson" method="POST">
@csrf
<div>
{{--WORKS--}}
<x-jet-label for="name" value="{{ __('Name') }}"></x-jet-label>
<x-jet-input wire:model.defer="name"
id="name"
name="name"
type="text"
autocomplete="off"
required>
</x-jet-input>
@error('name') <span>{{$message}}</span> @enderror
</div>
<div>
{{--WORKS---}}
<label for="agree">{{ __('Agree?') }}</label>
<select wire:model.defer="agree"
id="agree"
name="agree"
required>
<option value="1">
{{ __('Yes') }}
</option>
<option value="0">
{{ __('No') }}
</option>
</select>
@error('agree') <span>{{$message}}</span> @enderror
</div>
<div>
{{--DOES NOT WORK--}}
<x-jet-label for="town" value="{{ __('Town') }}"></x-jet-label>
<select wire:model.defer="town"
name="town[]"
id="town"
class="select2-multiple-town"
style="width: 100%"
autocomplete="off"
multiple
required>
@isset($items)
@foreach($items as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
@endisset
</select>
@error('town') <span class="text-sm text-red-600">{{$message}}</span> @enderror
</div>
<div>
<button type="submit">{{ __('Create') }}</button>
</div>
</form>
</div>
@push('modals')
<script type="text/javascript">
function select2Init() {
$('.select2-multiple-town').select2({
minimumInputLength: 2
});
}
document.addEventListener("DOMContentLoaded", () => {
Livewire.hook('component.initialized', (component) => {
select2Init();
});
Livewire.hook('message.processed', (message, component) => {
select2Init();
})
})
</script>
@endpush
class AddPerson extends Component
{
#VARIABLES FROM CONTROLER
public $items = [];
@VARIABLES FROM COMPONENT
public $name;
public $agree;
public $town = [];
protected $rules = [
'name' => 'required',
'agree' => 'required',
'town' => 'required',
];
public function createPerson()
{
$this->validate();
Person::create([
'name' => $this->name,
'agree' => $this->agree,
'town' => $this->town,
]);
$this->reset();
$this->redirect(route('moderator.main'));
}
public function render()
{
return view('livewire.mod.add-person');
}
}
基本上,您需要告诉 Livewire 忽略您原来的 select 项,然后使用 javascript 挂接到 select 选择器上的已更改事件。您可以看到 blade 指令 @this.set('foo', e.target.value);
,它告诉您的 Livewire Class 将 public 属性 的值设置为在 select 选择器中选择的值.
我对日期时间选择器使用了相同的方法,效果也一样。
这是一个代码示例
<script>
$(document).ready(function() {
$('#select2').select2();
$('#select2').on('change', function (e) {
var data = $('#select2').select2("val");
@this.set('foo', data);
});
});
</script>
我创建了一个 livewire 组件,我在其中创建了一个带有普通输入的表单和多个 select 和 select2。我填写了字段并 select 在 select 中编辑了必要的选项,所有变量(来自默认输入和默认 select)都被发送,除了 select2.
通过ddd();它表明它们是 []。通过控制台,我可以看到除了 select 和 select2 之外的所有变量都已发送。
可能是什么问题?
<div>
<form wire:submit.prevent="createPerson" method="POST">
@csrf
<div>
{{--WORKS--}}
<x-jet-label for="name" value="{{ __('Name') }}"></x-jet-label>
<x-jet-input wire:model.defer="name"
id="name"
name="name"
type="text"
autocomplete="off"
required>
</x-jet-input>
@error('name') <span>{{$message}}</span> @enderror
</div>
<div>
{{--WORKS---}}
<label for="agree">{{ __('Agree?') }}</label>
<select wire:model.defer="agree"
id="agree"
name="agree"
required>
<option value="1">
{{ __('Yes') }}
</option>
<option value="0">
{{ __('No') }}
</option>
</select>
@error('agree') <span>{{$message}}</span> @enderror
</div>
<div>
{{--DOES NOT WORK--}}
<x-jet-label for="town" value="{{ __('Town') }}"></x-jet-label>
<select wire:model.defer="town"
name="town[]"
id="town"
class="select2-multiple-town"
style="width: 100%"
autocomplete="off"
multiple
required>
@isset($items)
@foreach($items as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
@endisset
</select>
@error('town') <span class="text-sm text-red-600">{{$message}}</span> @enderror
</div>
<div>
<button type="submit">{{ __('Create') }}</button>
</div>
</form>
</div>
@push('modals')
<script type="text/javascript">
function select2Init() {
$('.select2-multiple-town').select2({
minimumInputLength: 2
});
}
document.addEventListener("DOMContentLoaded", () => {
Livewire.hook('component.initialized', (component) => {
select2Init();
});
Livewire.hook('message.processed', (message, component) => {
select2Init();
})
})
</script>
@endpush
class AddPerson extends Component
{
#VARIABLES FROM CONTROLER
public $items = [];
@VARIABLES FROM COMPONENT
public $name;
public $agree;
public $town = [];
protected $rules = [
'name' => 'required',
'agree' => 'required',
'town' => 'required',
];
public function createPerson()
{
$this->validate();
Person::create([
'name' => $this->name,
'agree' => $this->agree,
'town' => $this->town,
]);
$this->reset();
$this->redirect(route('moderator.main'));
}
public function render()
{
return view('livewire.mod.add-person');
}
}
基本上,您需要告诉 Livewire 忽略您原来的 select 项,然后使用 javascript 挂接到 select 选择器上的已更改事件。您可以看到 blade 指令 @this.set('foo', e.target.value);
,它告诉您的 Livewire Class 将 public 属性 的值设置为在 select 选择器中选择的值.
我对日期时间选择器使用了相同的方法,效果也一样。 这是一个代码示例
<script>
$(document).ready(function() {
$('#select2').select2();
$('#select2').on('change', function (e) {
var data = $('#select2').select2("val");
@this.set('foo', data);
});
});
</script>