Livewire how to $emit event on select change (wire:model)

RomkaLTU picture RomkaLTU · Oct 5, 2020 · Viewed 9.4k times · Source

Livewire how to $emit event on <select> change (wire:model)

I need to fire event (fetch some data from DB in another component) on simple <select> change.

<select id="hall" wire:model="hall_id">...</select>

How to watch changes for this model? On VueJS we just set $watch or $computed properties, I believe in livewire should be something similar. It's strange why there is no wire:change directive.

This is how I'm trying to emit event now:

<?php

namespace App\Http\Livewire;

use App\Models\Event;
use App\Models\Hall;
use Livewire\Component;

class ShowReservationForm extends Component
{
    public $hall_id = '';

    protected $queryString = [
        'hall_id' => ['except' => ''],
    ];

    public function mounted()
    {
        //
    }

    public function updatedHallId($name, $value)
    {
        $this->emit('hallChanged', $value);
    }

    public function render()
    {
        return view('livewire.show-reservation-form', [
            'halls' => Hall::all(),
        ]);
    }

    public function getHallEventsProperty()
    {
        return Event::where('hall_id', $this->hall_id)->get();
    }
}

and catch it:

<?php

namespace App\Http\Livewire;

use Livewire\Component;

class ShowReservations extends Component
{
    protected $listeners = ['hallChanged'];

    public $showTable = false;

    public function render()
    {
        return view('livewire.show-reservations');
    }

    public function hallChanged()
    {
        $this->showTable = true;
    }
}

Must be missing something obvious.

Answer

Kamlesh Paul picture Kamlesh Paul · Oct 5, 2020

use wire:change

<select id="hall" wire:model="hall_id" wire:change="change">...</select>

then in component

In ShowReservationForm.php

public function change()
{
     $this->emit('hallChanged'); 
}

then you can listen it on ShowReservations component ref link https://laravel-livewire.com/docs/2.x/events

in ShowReservations.php

 protected $listeners = ['hallChanged' => 'change'];

public function change()
{
   $this->showTable = true;
}