Deskripsi

Saya mengetik properti model petunjuk dan mencoba menghapus data undangan. Di bawah ini adalah kesalahan yang melemparkan saya kembali. Tolong bantu saya dengan itu, karena saya tidak dapat menemukan apa yang saya lewatkan.

Properti yang diketik App\Http\Livewire\Backend\UserManagement\FormComponent\InvitationManagementModal::$invitation tidak boleh diakses sebelum inisialisasi

Cuplikan kode yang dilucuti dan dapat disalin

  • Livewire\InvitationManagementModal.php
<?php

namespace App\Http\Livewire\Backend\UserManagement\FormComponent;

use Livewire\Component;

use Livewire\WithPagination;
use App\Http\Livewire\Backend\DataTable\WithCachedRows;

use App\Models\Invitation;

class InvitationManagementModal extends Component
{
    use WithPagination, WithCachedRows;
    
    public $showInvitationManagementModal = false;
    public Invitation $invitation;

    protected $listeners = ['manageInvitation'];

    public function manageInvitation()
    {
        $this->showInvitationManagementModal = true;
    }

    public function deleteInvitation(Invitation $invitation)
    {
        $this->invitation->delete();
    }

    public function getInvitationRowsProperty()
    {
        return $this->cache(function () {
            $invitations = Invitation::where('registered_at', null)->paginate(5);
            return $invitations;
        });
    }

    public function render()
    {
        return view('livewire.backend.user-management.form-component.invitation-management-modal', ['invitations' => $this->invitationRows]);
    }
}
  • livewire\invitation-management-modal.blade.php
<div>
    <x-modal.stacked wire:model.defer="showInvitationManagementModal" id="scroll-lock">
        <x-slot name="title">Manage Invitation</x-slot>
        <x-slot name="description">Manage all the invitations which are yet to be accepted.</x-slot>
        <x-slot name="content">
            <div class="p-8 space-y-4">
                <ul class="flex flex-col divide divide-y w-full bg-white rounded-lg shadow">
                    @forelse($invitations as $key => $invitation)
                        <li class="flex flex-row">
                            <div class="flex flex-1 items-center px-8 py-4">
                                <div class="flex-1 mr-16">
                                    <div class="text-sm dark:text-white">
                                        {{ $invitation->email }}
                                    </div>
                                </div>
                                <button wire:click="deleteInvitation" class="text-right flex justify-end">
                                    <x-icon.trash />
                                </button>
                            </div>
                        </li>
                    @empty
                    @endforelse
                </ul>
                <div>
                    {{ $invitations->links() }}
                </div>
            </div>
        </x-slot>
        <x-slot name="footer">
            <x-button.secondary wire:click.defer="$set('showInvitationManagementModal', false)">Cancel</x-button.secondary>
        </x-slot>
    </x-modal.stacked>
</div>

Konteks

  • Versi livewire: 2.3.5
  • Versi Laravel: 8.20.1
  • Versi Alpen: 2.8.0
  • Peramban: Chrome
2
ToxifiedHashkey 4 Januari 2021, 22:28

3 jawaban

Jawaban Terbaik

Jawaban lain di sini keduanya memiliki beberapa hal kecil yang perlu diperhatikan tentang mereka. Anda tidak perlu memeriksa $invitation, karena typehinting Invitation membuat Laravel menggunakan Model-Route-Binding, yang mengambil catatan yang sesuai - atau melempar kode status HTTP 404 jika tidak ditemukan.

Kedua, dan ini adalah kesalahan aktual yang saat ini Anda lihat sendiri, adalah bahwa Anda tidak perlu melakukan apa pun pada $this->invitation, karena tidak disetel. Anda sebaiknya meneruskan parameter ke metode.

Saat mengulang data di Livewire, selalu disarankan untuk menggunakan wire:key, sehingga Livewire dapat melacak setiap catatan dalam loop.

Jadi untuk metode hapus yang sebenarnya, panggil saja metode hapus pada variabel input.

public function deleteInvitation(Invitation $invitation)
{
    $invitation->delete();
    // Emit an event to notify the user that the record was deleted
    // Refresh the parent component to remove the invitation from the list

}

Untuk blade Anda, tambahkan wire:key ke elemen pertama dalam loop dan teruskan ID ke metode.
(jadi wire:click="deleteInvitation({{ $invitation->id }})" bukannya wire:click="deleteInvitation").

@forelse($invitations as $key => $invitation)
    <li class="flex flex-row" wire:key="invitation_{{ $invitation->id }}">
        <div class="flex flex-1 items-center px-8 py-4">
            <div class="flex-1 mr-16">
                <div class="text-sm dark:text-white">
                    {{ $invitation->email }}
                </div>
            </div>
            <button wire:click="deleteInvitation({{ $invitation->id }})" class="text-right flex justify-end">
                <x-icon.trash />
            </button>
        </div>
    </li>
@empty
@endforelse

Ini berarti bahwa, karena tidak pernah digunakan, Anda dapat menghapus deklarasi properti $invitation dari kelas tersebut, baris tepat setelah public $showInvitationManagementModal = false;.

public Invitation $invitation;
3
Qirel 5 Januari 2021, 06:41

Coba ini:

public function deleteInvitation(Invitation $invitation)
{
    if($invitation){
        $invitation->delete();
    }
}
0
Azahar Alam 5 Januari 2021, 05:05

Coba ini:

public function deleteInvitation(Invitation $invitation)
{
    $this->invitation = $invitation;
    $this->invitation->delete();
} 
0
Abhishek Gurjar 5 Januari 2021, 08:33