#php #laravel #laravel-livewire
#php #laravel #laravel-livewire
Вопрос:
Используя Laravel Livewire, у меня есть родительский и (повторяющийся) дочерний. Дочерний блейд имеет вызов childMethod()
through wire:click="childMethod()"
.
Проблема в том, что parent->childMethod()
он вызывается, когда я хотел child->childMethod()
, чтобы его вызывали.
Родительский компонент
class StatementsTable extends Component // parent
{
public function render()
{
return view('livewire.statements-table', [
'statements' => Statement::limit(10)->get()
]);
}
}
Родительский statements-table.blade
<table class="table">
@foreach($statements as $statement)
@livewire('statement-line', ['statement' => $statement], key($statement->id))
@endforeach
</table>
Дочерний компонент:
class StatementLine extends Component
{
public $statement;
public $calls = 0;
public function childMethod()
{
$this->calls = 1;
}
public function mount($statement): void
{
$this->statement = $statement;
}
public function render()
{
return view('livewire.statement-line');
}
}
Дочерний statement-line.blade
{{-- dd(get_defined_vars()) --}}
<tr>
<td>{{$statement->name}}</td>
<td>{{$statement->date}}</td>
<td>{{$calls}}</td>
<td><button wire:click="childMethod">Plus</button></td>
</tr>
Почему я получаю
LivewireExceptionsMethodNotFoundException
Unable to call component method. Public method [childMethod] not found on component: [statements-table]
Комментарии:
1. Слишком много кодов для ответа
2. @PaulH Я тоже сталкиваюсь с этой проблемой. Вы нашли решение?
Ответ №1:
Возникла та же проблема. Решение было:
Убедитесь, что дочернее представление имеет ОДИН корневой элемент, как указано в документах Livewire .
Комментарии:
1. Хотя это действительно очень важно, это не причина проблемы. Единственным корневым элементом родительского элемента является <table>, а единственным корневым элементом дочернего элемента является <tr>
Ответ №2:
Вы можете использовать свои обратные вызовы в livewire, взглянув на документацию, доступную здесь https://laravel-livewire.com/docs/2.x/events#scoping-events
В вашем случае вы должны использовать self следующим образом
<button wire:click="$emitSelf('childMethod')">
Ответ №3:
для передачи параметров (строки) в функции убедитесь, что вы используете одинарные ''
кавычки , обратите внимание на двойные кавычки ""
. Нравится :
wire:click="activeTab('product')"