Para usar menos recursos, quiero obtener datos del servidor (usando livewire) solo por primera vez y las otras veces para usar los datos ya obtenidos en alpinejs.
Entonces, si hay un cambio en mi <select> , se fillStates los estados de relleno:
<select wire:model="selectedCountry" name="selectedCountry" id="selectedCountry" wire:change="fillStates"> <option value="">Select Country</option> @foreach($this->countries as $country) <option value="{{ $country->id }}">{{ $country->name }}</option> @endforeach </select> El método fillStates devolverá los datos:
public function fillStates() { $states = State::where('country_id', $this->selectedCountry)->get(); if(count($states)) { $this->states[$this->selectedCountry] = $states; return $this->states[$this->selectedCountry]; } return []; } Y mi pregunta está aquí. ¿Cómo puedo evitar que solicite más de una vez cuando $this->states[$country] ya tiene valor y se puede acceder con alpinejs?
Por ejemplo, selecciono Estados Unidos en mi <select> . Por primera vez, necesita obtener los datos que son sus estados. Lo cambio a Canadá. Esta vez necesita recuperar los datos que son sus estados. Pero si vuelvo a seleccionar Estados Unidos, no debería solicitarlo, ya que ya se ha obtenido y está disponible en alpinejs. ¿Cómo puedo lograrlo?
Creo que tienes que validar manualmente usando alpinejs.
<div x-data="{ selectedCountry: null, countries: {}, }" x-init="$watch('selectedCountry', () => { if(! (selectedCountry in countries)) { @this.call('fillStates'); countries[selectedCountry] = @this.get('states'); } })" > <select x-model="selectedCountry" name="selectedCountry" id="selectedCountry" > <option value="">Select Country</option> @foreach($this->countries as $country) <option value="{{ $country->id }}">{{ $country->name }}</option> @endforeach </select> </div>