如何使用 livewire 重新初始化 select2

问题描述 投票:0回答:1

我正在使用 Select2,在第一页加载时它工作正常,并且我能够设置 livewire 属性,但是在使用wire:navigate 导航时我失去了样式。我对此做了一些研究,推荐的方法是使用 livewire:naviated 事件重新初始化,但是重新初始化后如何获取 livewire 属性?

我的合作伙伴列表视图

<div>
    @include('layouts.navbars.auth.topnav', ['title' => 'List Partners'])
    <div class="container-fluid py-4">
        <div class="row">
            <div class="col-12">
                <div class="card mb-4">
                    <div class="card-header pb-0">
                        <h6>Filters</h6>
                    </div>
                    <div class="card-body">
                        <div class="row p-3 my-3">
                            <div class="col-md-3">
                                <div wire:ignore class="form-group">
                                    <label for="status_id" class="form-label">Filter by status</label>
                                    <select id="status_id" class="form-control select2 filter"
                                            wire:change="$dispatch('filter')" wire:model="status_id" required>
                                        <option value="all">All</option>
                                        @foreach ($statuses as $status)
                                            <option value="{{ $status->id }}">{{ $status->status_name }}</option>
                                        @endforeach
                                    </select>
                                </div>
                            </div>
                            <div class="col-md-3">
                                <div wire:ignore class="form-group">
                                    <label for="office_id" class="form-label">Filter by office</label>
                                    <select id="office_id" class="form-control select2 filter"
                                            wire:change="$dispatch('filter')" wire:model="office_id" required>
                                        <option value="all">All</option>
                                        @foreach ($offices as $office)
                                            <option value="{{ $office->id }}">{{ $office->name }}</option>
                                        @endforeach
                                    </select>
                                </div>
                            </div>
                            <div class="col-md-3">
                                <div wire:ignore class="form-group">
                                    <label for="partner_type" class="form-label">Filter by partner type</label>
                                    <select id="partner_type" class="form-control select2 filter"
                                            wire:change="$dispatch('filter')" wire:model="partner_type"
                                            required>
                                        <option value="all">All</option>
                                        <option value="individual">Individual</option>
                                        <option value="non-individual">Non Individual</option>
                                    </select>
                                </div>
                            </div>
                            <div class="col-md-3">
                                <div wire:ignore class="form-group">
                                    <label for="vehicle_id" class="form-label">Filter by vehicle</label>
                                    <select id="vehicle_id" class="form-control select2 filter"
                                            wire:change="$dispatch('filter')" wire:model="vehicle_id" required>
                                        <option value="all">All</option>
                                        @foreach ($vehicles as $vehicle)
                                            <option value="{{ $vehicle->id }}">{{ $vehicle->reg_number }}</option>
                                        @endforeach
                                    </select>
                                </div>
                            </div>
                            <div class="col-md-3">
                                <div class="form-group">
                                    <label for="">Search</label>
                                    <div class="input-group">
                                        <input type="text" id="search" class="form-control filter"
                                               wire:keyup.debounce="$dispatch('filter')" wire:model="search"
                                               placeholder="Search by name, email.."
                                               value="{{ $request->search ?? '' }}">
                                    </div>
                                </div>

                            </div>

                        </div>
                    </div>
                </div>
                <div class="card mb-4">
                    <div class="card-header pb-0">
                        <div class="d-flex align-items-center">
                            <h6>Clients Table</h6>
                            @can('clients.create')
                                <a href="{{ route('clients.create') }}" wire:navigate
                                   class="btn ms-auto btn-sm bg-gradient-primary"> <i
                                        class="fa fa-plus-square me-1" aria-hidden="true"></i> Add Client
                                </a>
                            @endcan
                        </div>
                    </div>

                    <div class="card-body px-0 pt-0 pb-2">
                        <div class="table-responsive p-0">
                            <table class="table align-items-center mb-0">
                                <thead>
                                <tr>
                                    <th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">
                                        Partner
                                    </th>
                                    <th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">
                                        Type
                                    </th>
                                    <th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">
                                        Office
                                    </th>
                                    <th
                                        class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7 ps-2">
                                        ID Number
                                    </th>
                                    <th
                                        class="text-center text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">
                                        Status
                                    </th>
                                    <th
                                        class="text-center text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">
                                        Action
                                    </th>
                                    <th class="text-secondary opacity-7"></th>
                                </tr>
                                </thead>
                                <tbody>
                                <tr>
                                    <td style="border:0px;" colspan="6" class="text-center text-success">
                                        <div wire:loading class="spinner-border text-center mt-2" role="status">
                                            <span class="sr-only">Loading...</span>
                                        </div>
                                    </td>
                                </tr>
                                @forelse ($partners as $partner)
                                    <tr wire:loading.remove>
                                        <td>
                                            <div class="d-flex px-2 py-1">
                                                {{-- <div>
                                                <img src="/img/team-2.jpg" class="avatar avatar-sm me-3" alt="user1">
                                            </div> --}}
                                                <div class="d-flex flex-column justify-content-center">
                                                    <h6 class="mb-0 text-sm">{{ $partner->first_name }}
                                                        {{ $partner->last_name }}</h6>
                                                    <p class="text-xs text-secondary mb-0">{{ $partner->user->email }}
                                                    </p>
                                                    <p class="text-xs text-secondary mb-0">
                                                        {{ $partner->user->phone_number }}</p>

                                                </div>
                                            </div>
                                        </td>
                                        <td>
                                            <p class="text-xs font-weight-bold mb-0 text-uppercase">
                                                {{ $partner->partner_type }}</p>
                                        </td>
                                        <td>
                                            <p class="text-xs font-weight-bold mb-0">{{ empty($partner->office) ? 'N/A' :$partner->office->name }}</p>
                                        </td>
                                        <td class="align-middle ">
                                                <span
                                                    class="text-secondary text-xs font-weight-bold">{{ $partner->id_number }}</span>
                                        </td>
                                        <td class="align-middle text-center text-sm">
                                            @switch($partner->status->status_name)
                                                @case('Active')
                                                <span class="badge badge-pill bg-gradient-success">
                                                            {{ $partner->status->status_name }}
                                                        </span>
                                                @break

                                                @case('Terminated')
                                                <span class="badge badge-pill bg-gradient-danger">
                                                            {{ $partner->status->status_name }}
                                                        </span>
                                                @break

                                                @case('Unverified')
                                                <span class="badge badge-pill bg-gradient-primary">
                                                            {{ $partner->status->status_name }}
                                                        </span>
                                                @break

                                                @default
                                                <span class="badge badge-pill bg-gradient-danger">
                                                            {{ $partner->status->status_name }}
                                                        </span>
                                            @endswitch

                                        </td>

                                        <td class="align-middle">
                                            <div class="d-flex flex-row justify-content-center">
                                                <a href="{{ route('partners.edit', ['partner' => $partner->id]) }}"
                                                   class="text-secondary font-weight-bold text-xs mx-2"
                                                   data-bs-toggle="tooltip" title="Edit partner">
                                                    <i class="fa fa-pencil-alt" aria-hidden="true"></i> Edit
                                                </a>
                                                <a href="{{ route('partners.show', ['partner' => $partner->id]) }}"
                                                   class="text-primary font-weight-bold text-xs mx-2"
                                                   data-bs-toggle="tooltip" title="View vehicle">
                                                    <i class="fa fa-eye" aria-hidden="true"></i> View
                                                </a>
                                            </div>
                                        </td>
                                    </tr>
                                @empty
                                    <tr>
                                        <td colspan="6" class="text-center text-danger">No available partners</td>
                                    </tr>
                                @endforelse

                                </tbody>
                            </table>
                            <div class="mt-4 px-2 w-100 pb-4">
                                {{ $partners->onEachSide(5)->links() }}
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>


@push('js')
    <script>

        $(document).ready(function () {

            $("#status_id").select2();
            $("#status_id").change(function (e) {
            @this.set('status_id', $(this).val(), true)
            })

            $("#office_id").select2();
            $("#office_id").change(function (e) {
            @this.set('office_id', $(this).val(), true)
            })

            $("#vehicle_id").select2();
            $("#vehicle_id").change(function (e) {
            @this.set('vehicle_id', $(this).val(), true)
            })

            $("#partner_type").select2();
            $("#partner_type").change(function (e) {
            @this.set('partner_type', $(this).val(), true)
            })

        });
    </script>
@endpush

我的班级

<?php

namespace App\Livewire\Partners;

use App\Models\Office;
use App\Models\Partner;
use App\Models\Status;
use App\Models\Vehicle;
use Livewire\Attributes\On;
use Livewire\Component;
use Livewire\WithPagination;

class ListPartners extends Component
{
    use WithPagination;

    protected $paginationTheme = 'bootstrap';

    public $search;

    public $office_id;

    public $vehicle_id;

    public $status_id;

    public $partner_type;

    public $statuses;

    public $offices;

    public $vehicles;


    public function mount()
    {
        $this->statuses = Status::all();
        $this->offices = Office::all();
        $this->vehicles = Vehicle::all();
    }

    #[On('filter')]
    public function render()
    {

        $partners = Partner::orderBy('created_at', 'desc');

        if (!empty($this->search)) {
            $partners->where(function ($p) {
                $p->where("first_name", "like", "%" . $this->search . "%")
                    ->orWhere('last_name', 'like', "%$this->search%")
                    ->orWhereHas('user', function ($q) {
                        $q->where('email', 'like', "%$this->search%")
                            ->orWhere('phone_number', 'like', "%$this->search%");
                    });
            });
        }
        if (!empty($this->office_id) && $this->office_id !== 'all') {
            $partners->where('office_id', $this->office_id);
        }

        if (!empty($this->status_id) && $this->status_id !== 'all') {
            $partners->where('status_id', $this->status_id);
        }

        if (!empty($this->partner_type) && $this->partner_type !== 'all') {
            $partners->where('partner_type', $this->partner_type);
        }

        if (!empty($this->vehicle_id) && $this->vehicle_id !== 'all') {
            $partners->whereHas('currentVehicles', function ($query) {
                $query->where('vehicle_id', $this->vehicle_id);
            });
        }

        $partners = $partners->with(['user','status','subUsers','office','currentVehicles']);

        return view('livewire.partners.list-partners', ['partners' => $partners->paginate(10)])
            ->extends('layouts.app')
            ->section('content');
    }


}

重新初始化选择 2

<script data-navigate-once>
    document.addEventListener('livewire:navigated', () => {
        console.log('test');
        $("#status_id").select2()
        $("#office_id").select2()
        $("#vehicle_id").select2()
        $("#partner_type").select2()
        $("#client_type").select2()
        $("#vehicle_class_id").select2()
        $("#fuel_type_id").select2()
        $("#vehicle_type_id").select2()
    })

</script>

laravel laravel-livewire
1个回答
0
投票

$("#status_id").select2();
        $("#status_id").change(function (e) {
            Livewire.dispatch('set-partner-filter-status-id',{ status_id :  $(this).val()});
        })
© www.soinside.com 2019 - 2024. All rights reserved.