Livewire flash 消息仅在执行操作时出现一次
Livewire flash message appears only once when action if performed
大家好,我只想知道如何在每次执行操作时都显示一条闪现消息。
我的 blade 中有一个类别 table,在每一行的末尾都有一个删除按钮,当我按下它时,操作成功执行并且我的闪存消息显示为弹出窗口 (SweetAlert2) 但是当我删除了另一行,删除功能运行成功,但弹出窗口不再出现。
在我的blade
@if(session()->has('process-error'))
<script>
Swal.fire(
'Error',
'{{ session('process-error') }}',
'error'
)
</script>
@endif
@if(session()->has('process-success'))
<script>
Swal.fire(
'Success',
'{{ session('process-success') }}',
'success'
)
</script>
@endif
在我的组件中
public function delete($id)
{
$categoriesService = CategoriesService::deleteCategory($id);
if(!$categoriesService)
{
// RETURN AN ERROR MESSAGE
session()->flash('process-error' , 'Failed to delete the category');
return;
}
// RETURN A SUCCESS MESSAGE
session()->flash('process-success' , 'Category deleted successfully!');
}
如果你已经安装了Swall,你不需要通过session()->flash()显示它。您可以发送一个 js 事件并像
一样捕获它
if(!$categoriesService)
{
// RETURN AN ERROR MESSAGE
$this->dispatchBrowserEvent('process-swall',['type' => 'error']);
return;
}
// RETURN A SUCCESS MESSAGE
$this->dispatchBrowserEvent('process-swall' ,['type' => 'success']);
}
//in script section
<script>
window.addEventListener('process-swall', event => {
let type = event.detail.type;
let message = type === 'success' ? 'Category deleted successfully!' : 'Failed to delete the category';
let camelCaseType = type === 'success' ? 'Success' : 'Error';
Swal.fire(
camelCaseType,
message,
type
)
})
</script>
我会说你最好分派 browser-event 并在 JavaScript 中收听它,而不是使用会话。请求之间的会话可能有点棘手,因为 Livewire 实际上是无状态的 API.
当使用dispatchBrowserEvent()
时,您可以将数据作为第二个参数传入,它将在事件的event.detail
属性中可用。
public function delete($id)
{
$categoriesService = CategoriesService::deleteCategory($id);
if (!$categoriesService) {
$swalData = [
'type' => 'error',
'title' => 'Error',
'message' => 'Failed to delete category',
];
} else {
$swalData = [
'type' => 'success',
'title' => 'Success',
'message' => 'Sucessfully deleted category',
];
}
$this->dispatchBrowserEvent('notify-swal', $swalData);
}
然后 - 在您的 blade 中(可能会建议在您的布局中,这样它可以在所有组件中重复使用),为该事件添加一个侦听器。
@once
<script>
window.addEventListener('notify-swal', function(e) {
let data = e.detail;
let title = data.title;
let message = data.message;
let type = data.type;
Swal.fire(title, message, type);
});
</script>
@endonce
大家好,我只想知道如何在每次执行操作时都显示一条闪现消息。 我的 blade 中有一个类别 table,在每一行的末尾都有一个删除按钮,当我按下它时,操作成功执行并且我的闪存消息显示为弹出窗口 (SweetAlert2) 但是当我删除了另一行,删除功能运行成功,但弹出窗口不再出现。
在我的blade
@if(session()->has('process-error'))
<script>
Swal.fire(
'Error',
'{{ session('process-error') }}',
'error'
)
</script>
@endif
@if(session()->has('process-success'))
<script>
Swal.fire(
'Success',
'{{ session('process-success') }}',
'success'
)
</script>
@endif
在我的组件中
public function delete($id)
{
$categoriesService = CategoriesService::deleteCategory($id);
if(!$categoriesService)
{
// RETURN AN ERROR MESSAGE
session()->flash('process-error' , 'Failed to delete the category');
return;
}
// RETURN A SUCCESS MESSAGE
session()->flash('process-success' , 'Category deleted successfully!');
}
如果你已经安装了Swall,你不需要通过session()->flash()显示它。您可以发送一个 js 事件并像
一样捕获它if(!$categoriesService)
{
// RETURN AN ERROR MESSAGE
$this->dispatchBrowserEvent('process-swall',['type' => 'error']);
return;
}
// RETURN A SUCCESS MESSAGE
$this->dispatchBrowserEvent('process-swall' ,['type' => 'success']);
}
//in script section
<script>
window.addEventListener('process-swall', event => {
let type = event.detail.type;
let message = type === 'success' ? 'Category deleted successfully!' : 'Failed to delete the category';
let camelCaseType = type === 'success' ? 'Success' : 'Error';
Swal.fire(
camelCaseType,
message,
type
)
})
</script>
我会说你最好分派 browser-event 并在 JavaScript 中收听它,而不是使用会话。请求之间的会话可能有点棘手,因为 Livewire 实际上是无状态的 API.
当使用dispatchBrowserEvent()
时,您可以将数据作为第二个参数传入,它将在事件的event.detail
属性中可用。
public function delete($id)
{
$categoriesService = CategoriesService::deleteCategory($id);
if (!$categoriesService) {
$swalData = [
'type' => 'error',
'title' => 'Error',
'message' => 'Failed to delete category',
];
} else {
$swalData = [
'type' => 'success',
'title' => 'Success',
'message' => 'Sucessfully deleted category',
];
}
$this->dispatchBrowserEvent('notify-swal', $swalData);
}
然后 - 在您的 blade 中(可能会建议在您的布局中,这样它可以在所有组件中重复使用),为该事件添加一个侦听器。
@once
<script>
window.addEventListener('notify-swal', function(e) {
let data = e.detail;
let title = data.title;
let message = data.message;
let type = data.type;
Swal.fire(title, message, type);
});
</script>
@endonce