php 如何使用livewire将参数从嵌套组件传递给父组件?

irlmq6kh  于 11个月前  发布在  PHP
关注(0)|答案(1)|浏览(95)

我试图在livewire中创建一个系统,允许用户添加/编辑房屋,但也允许在每个房屋中添加/编辑房间。
我创建了houseroom模型以及createHouse和嵌套room刀片文件。房子的细节得到保存,但房间没有。我相信我需要使用$emitUp将roomid和name参数传递回House组件,但我显然做错了什么。

views/livewire/houses/createHouse.blade.php

<div role="dialog" aria-modal="true" aria-labelledby="modal-headline">
            <form>
                <div class="w-1/2 pr-4">
                        <div class="mb-4">
                            <label for="input1">Address1:</label>
                            <input type="text" id="input1" placeholder="Enter Address" wire:model.defer="address1">
                        </div>
                        <div class="mb-4">
                            <label for="input2">Town:</label>
                            <input type="text" id="input2" placeholder="Enter Town" wire:model.defer="town">
                        </div>
                    </div>
                    <div class="w-1/2">
                        <h3 class="mb-2">Rooms</h3>
                        @foreach ($rooms as $key => $room)
                            @livewire('room-show', [$room])
                        @endforeach
                    
                    <span>
                        <button wire:click.prevent="store()" type="button">
                        Save
                        </button>
                    </span>
                </div>
            </form>
        </div>

字符串

views/livewire/rooms/room.blade.php

<div>
    <input type="text" wire:keydown="$emitUp('roomNameUpdated', '{{ $id }}', '{{ $name }}')"
        id="roomName" wire:model.defer="name" placeholder="Name">
</div>

http/Livewire/Houses.php

<?php

namespace App\Http\Livewire;

use App\Models\House;
use App\Models\Room;
use Livewire\Component;

class Houses extends Component
{
    public $houses, $address1, $town;
    public $isOpen = 0;
    protected $listeners = ['roomNameUpdated' => 'updateRoomName'];
    
    public function render()
    {
        $this->houses = House::all();
        return view('livewire.houses.houses');
    }

   
    public function updateRoomName($id, $name)
    {
        //I want to update the room name here
       // But $name doesn't show the updated name and $id isn't recognised
    }

public function store()
{
    //Update the house details
    House::updateOrCreate(['id' => $this->house_id], [
        'address1' => $this->address1,
        'town' => $this->town
    ]);

    //delete all rooms for this house
    Room::where('house_id',$this->house_id)->delete();

    //re-add all rooms for this house
    foreach($this->rooms as $room){
        Room::updateOrCreate(['id' => $room->id], [
            'house_id' => $this->house_id,
            'name' => $room->name,
        ]); 
    }

    session()->flash('message', $this->house_id ? 'House Updated Successfully.' : 'House Created Successfully.');
}

j2datikz

j2datikz1#

@Urbycoz
传递$key作为索引(createHouse.blade.php)

@foreach ($rooms as $room)
    @livewire('room-show', ['room' => $room], key($room->id))
@endforeach

字符串
传递名称和索引(room.blade.php)

<div>
    <input type="text" wire:keydown="$emitUp('roomNameUpdated', {{ $room->id }}, $event.target.value)"
        id="roomName" wire:model.defer="name" placeholder="Name">
</div>


更新存储方法

public function store()
{
    // ...

    // Update rooms for this house
    foreach ($this->roomsShown as $key => $room) {
        Room::updateOrCreate(['id' => $key], [
            'house_id' => $this->house_id,
            'name' => $room['name'],
        ]);
    }

    // ...
}


更新updateRoomName方法

public function updateRoomName($roomId, $name)
{
    $this->roomsShown[$roomId]['name'] = $name;
}

相关问题