【问题标题】:How to Use Select2 Multiple Select in Livewire?如何在 Livewire 中使用 Select2 多选?
【发布时间】:2021-11-23 12:33:04
【问题描述】:

我在 livewire 中使用 select2。添加数据时,它起作用了。但是在编辑数据时,不更改选择选项中的数据,之前选择的训练器数据全部丢失。

这是我编写的代码。

Edit.php

<?php

namespace App\Http\Livewire\Admin\Courses;

use App\Models\Course;
use App\Models\Trainer;
use Livewire\Component;
use Jantinnerezo\LivewireAlert\LivewireAlert;
use Livewire\WithFileUploads;
use \Cviebrock\EloquentSluggable\Services\SlugService;

class Edit extends Component
{
    use LivewireAlert;
    use WithFileUploads;

    public $title, $slug, $cover, $video, $link, $method, $format, $duration, $price, $description, $isActive, $meta_keywords, $meta_description, $addon_styles, $addon_scripts, $courseId;
    public $trainer_id;
    public function mount($id)
    {
        $course = Course::findOrFail($id);
        if ($course) {
            $this->courseId         = $course->id;
            $this->trainer_id       = $course->trainer_id;
            $this->title            = $course->title;
            $this->slug             = $course->slug;
            $this->link             = $course->link;
            $this->method           = $course->method;
            $this->format           = $course->format;
            $this->duration         = $course->duration;
            $this->price            = $course->price;
            $this->description      = $course->description;
            $this->isActive         = $course->isActive;
            $this->meta_keywords    = $course->meta_keywords;
            $this->meta_description = $course->meta_description;
            $this->addon_styles     = $course->addon_styles;
            $this->addon_scripts    = $course->addon_scripts;
        }
    }

    public function updatedTitle()
    {
        $this->slug = SlugService::createSlug(Course::class, 'slug', $this->title);
    }

    public function update()
    {
        $course = Course::where('id',$this->courseId)->first();

        $this->validate([
            'title'         => 'required',
            'cover'         => $this->cover ? 'required|image|mimes:png,jpg,webp,jpeg' : '',
            'description'   => 'required',
        ]);

        if ($this->cover) {
            \Storage::delete('public/'.$course->cover);

            $fileName = time().'_'.$this->cover->getClientOriginalName();
            $filePath = $this->cover->storeAs('images/courses', $fileName, 'public');
        } else {
            $filePath = $course->cover ?? null;
        }

        if ($this->video) {

            \Storage::delete('public/'.$course->video);

            $fileName = time().'_'.$this->video->getClientOriginalName();
            $video = $this->cover->storeAs('images/courses', $fileName, 'public');
        } else {
            $video = $course->video ?? null;
        }

        $course->update([
            'title'             => $this->title,
            'slug'              => $this->slug,
            'cover'             => $filePath,
            'video'             => $this->video ? $video : null,
            'link'              => $this->link,
            'method'            => $this->method,
            'format'            => $this->format,
            'duration'          => $this->duration,
            'price'             => $this->price,
            'description'       => $this->description,
            'isActive'          => $this->isActive,
            'meta_keywords'     => $this->meta_keywords,
            'meta_description'  => $this->meta_description,
            'addon_styles'      => $this->addon_styles,
            'addon_scripts'     => $this->addon_scripts
        ]);

        $course->trainers()->sync($this->trainer_id);

        $this->alert('success', 'Data updated successfully.');

        return redirect()->route('courses.index');
    }

    public function render()
    {
        return view('livewire.admin.courses.edit',[
            'trainers' => Trainer::where('isActive',true)->get(),
            'course'   => Course::find($this->courseId)
        ])
        ->extends('layouts.app')
        ->section('content');
    }
}

edit.blade.php

<div>
    @section('title', 'Edit Course')
    @section('styles')
    <script src="{{ asset('vendor/tinymce/tinymce.min.js') }}"></script>
    <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
    <style>
        span .selection {
            display: block;
        }
    </style>
    @endsection
    <!-- ========== title-wrapper start ========== -->
    <div class="title-wrapper pt-30">
        <div class="row align-items-center">
            <div class="col-md-6">
                <div class="title mb-30">
                    <h2>Edit Course</h2>
                </div>
            </div>
            <!-- end col -->
            <div class="col-md-6">
                <div class="breadcrumb-wrapper mb-30">
                    <nav aria-label="breadcrumb">
                        <ol class="breadcrumb">
                            <li class="breadcrumb-item">
                                <a href="{{ route('home') }}">Dashboard</a>
                            </li>
                            <li class="breadcrumb-item">
                                <a href="{{ route('courses.index') }}">Courses</a>
                            </li>
                            <li class="breadcrumb-item active" aria-current="page">
                                Edit Course
                            </li>
                        </ol>
                    </nav>
                </div>
            </div>
            <!-- end col -->
        </div>
        <!-- end row -->
    </div>
    <div class="row">
        <div class="col-lg-12">
            <div class="card-style mb-3">
                <form wire:submit.prevent="update" class="row g-3">
                    <input type="hidden" wire:model="courseId">
                    <div class="col-12">
                        <div class="mb-3">
                            <label for="cover" class="form-label">Cover</label><br>
                            @if ($cover)
                            Cover Preview:
                            <div class="card mb-3">
                                <img src="{{ $cover->temporaryUrl() }}" class="w-15 rounded-3">
                            </div>
                            @else
                            <div class="card mb-3">
                                <img src="{{ asset('storage/'.$course->cover) }}" class="w-15 rounded-3 img-fluid">
                            </div>
                            @endif
                            <input type="file" wire:model="cover" class="form-control @error('cover') is-invalid @enderror" id="cover">
                            @error('cover')
                            <div class="invalid-feedback">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>
                    </div>
                    <div class="col-md-6">
                        <div class="mb-3">
                            <label for="title" class="form-label">Title</label>
                            <input type="text" wire:model="title" class="form-control @error('title') is-invalid @enderror" id="title" placeholder="Course Title">
                            @error('title')
                            <div class="invalid-feedback">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>
                        <div class="mb-3">
                            <label for="slug" class="form-label">Slug</label>
                            <input type="text" wire:model="slug" class="form-control  @error('slug') is-invalid @enderror" id="slug" placeholder="course-slug">
                            @error('slug')
                            <div class="invalid-feedback">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>
                        <div class="mb-3" wire:ignore>
                            <label for="description" class="form-label">Description</label>
                            <textarea wire:model="description" class="form-control @error('description') is-invalid @enderror" id="description" rows="15"></textarea>
                            @error('description')
                            <div class="invalid-feedback">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>
                    </div>
                    <div class="col-md-6">
                        <div class="mb-3">
                            <label for="video" class="form-label">Video</label>
                            <input type="file" wire:model="video" class="form-control" id="video">
                        </div>
                        <div class="mb-3">
                            <label for="link" class="form-label">Link</label>
                            <input type="url" wire:model="link" class="form-control" id="link" placeholder="Youtube link">
                        </div>
                        <div class="mb-3">
                            <label for="method" class="form-label">Method</label>
                            <input type="text" wire:model="method" class="form-control" id="method" placeholder="Example: online, hybrid">
                        </div>
                        <div class="mb-3">
                            <label for="format" class="form-label">Format</label>
                            <input type="text" wire:model="format" class="form-control" id="format" placeholder="Eg: HD Video, Live Concultation">
                        </div>
                        <div class="mb-3">
                            <label for="duration" class="form-label">Duration</label>
                            <input type="text" wire:model="duration" class="form-control" id="duration" placeholder="Eg: 3 mounts">
                        </div>
                        <div class="mb-3">
                            <label for="price" class="form-label">Price</label>
                            <input type="number" wire:model="price" class="form-control @error('price') is-invalid @enderror" id="price" placeholder="Eg: 250000">
                            @error('price')
                            <div class="invalid-feedback">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>
                        <div class="mb-3" wire:ignore>
                            <label for="trainer" class="form-label">Trainer</label>
                            <select multiple="multiple" id="trainer" class="form-select @error('trainer_id') is-invalid @enderror" multiple>
                                @foreach ($trainers as $trainer)
                                <option {{  $course->trainers()->find($trainer->id) ? 'selected' : '' }} value="{{ $trainer->id }}">{{ $trainer->name }}</option>
                                @endforeach
                            </select>
                            @error('trainer_id')
                            <div class="invalid-feedback">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>
                    </div>
                    <div class="col-12">
                        <div class="mb-3">
                            <label for="meta_keywords" class="form-label">Meta Keywords</label>
                            <input type="text" wire:model="meta_keywords" class="form-control" id="meta_keywords" placeholder="keyword1, keyword2, keyword3">
                        </div>
                    </div>
                    <div class="col-12">
                        <div class="mb-3">
                            <label for="meta_description" class="form-label">Meta Description</label>
                            <input type="text" wire:model="meta_description" class="form-control" id="meta_description" placeholder="Meta description">
                        </div>
                    </div>
                    <div class="col-12">
                        <div class="form-check">
                            <input class="form-check-input" type="checkbox" id="gridCheck" wire:model="isActive">
                            <label class="form-check-label" for="gridCheck">
                            Set active
                            </label>
                        </div>
                    </div>
                    <button type="submit" class="w-100 main-btn primary-btn btn-hover btn-sm" wire:target="update" wire:loading.class="deactive-btn">
                    <span wire:loading.remove wire:target="update">
                    Update
                    </span>
                    <span wire:loading wire:target="update" class="text-center">
                    <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
                    Loading...
                    </span>
                    </button>
                </form>
            </div>
        </div>
    </div>
</div>
@push('scripts')
<script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<x-livewire-alert::scripts />
<script>
    tinymce.init({
        selector: 'textarea',
        menubar: 'file edit view insert format tools table help',
        plugins: [
            "advlist autolink autosave codesample lists link image charmap print preview hr anchor pagebreak",
            "searchreplace wordcount visualblocks visualchars code fullscreen",
            "insertdatetime media nonbreaking save table toc directionality",
            "emoticons template paste textpattern"
        ],
        toolbar: "restoredraft insertfile undo redo | styleselect fontselect fontsizeselect | bold italic | alignleft aligncenter alignright alignjustify codesample | bullist numlist outdent indent toc| link image media",
        setup: function(editor) {
            editor.on('change', function(e) {
                    console.log('the content ', editor.getContent());
                    @this.set('description', editor.getContent());
            });
        }
    });
    
</script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script>
    $(document).ready(function () {
        $('#trainer').select2();
        $('#trainer').on('change', function (e) {
            var data = $('#trainer').select2("val");
            @this.set('trainer_id', data);
        });
    });

</script>
@endpush

如何解决这个问题?这样,当我编辑数据并且不更改select2中的数据时,数据不会被删除。

谢谢

【问题讨论】:

    标签: laravel jquery-select2 laravel-livewire livewires


    【解决方案1】:

    这对我有用。

    在编辑我的模式时,我将数据加载到我的数组中,如下所示;

    public $selectedOn = [];
    
    public function edit($id){
       $foos = Foo::where('other_id',$id)->get();
       foreach($foos as $foo){
         array_push($this->selectedOn, $foo->id);
       }
       $this->emit('selectLoadOk');
    
    }
    

    在我的 js 中,我执行以下操作;

    window.livewire.on('selectLoadOk', () =>{
      $('#selectChecklist').trigger('change');
    });
    

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2021-08-01
      • 2022-12-22
      • 2021-08-10
      • 2023-03-14
      • 2014-12-31
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多