Отправка данных Livewire из компонента в библиотеку JS

У меня есть компонент livewire, включающий библиотеку js, gridstack.js .

Это то, что у меня есть на данный момент, и моя интерактивная сетка загружается правильно. Я могу настроить элементы стека сетки на странице и сохранить их в базе данных через $wire.taskMoved(newItems) в @script, все, как и ожидалось, в реальном времени и без какого-либо обновления. Мне нужна возможность отображать новые или отредактированные $task, созданные с помощью Livewire. Прямо сейчас мне нужно обновить страницу, чтобы увидеть все отредактированные или добавленные $task, созданные в серверной части.

<div>
    @foreach($projects as $project)
        <div class = "grid-stack gs-id-{{$project->id}}" id = "{{$project->id}}" wire:ignore>
            @foreach($days as $day_index => $day)
                @foreach($day->tasks as $task)
                    <div class = "grid-stack-item" gs-x = "{{$day_index}}" gs-w = "{{$task->duration}}" gs-y = "1" gs-id = "{{$task->id}}">
                        <div
                            wire:click = "$dispatchTo('tasks.task-create', 'editTask', { task_id: {{$task->id}} })"
                            class = "grid-stack-item-content"
                            >
                            <span>{{$task->title}}</span>
                        </div>
                    </div>
                @endforeach
            @endforeach
        </div>
    @endforeach

    <livewire:tasks.task-create :projects = "$projects" :days = "$days"/>
</div>

@assets
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/10.1.2/gridstack-all.js" defer></script>
    <link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/10.1.2/gridstack.min.css">
    <link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/10.1.2/gridstack-extra.min.css">
@endassets

@script
    <script>
        let grids = GridStack.initAll({
            column: 6,
            cellHeight: '60px',
            cellWidth: '100px',
            float: false,
            resizable: {
                handles: 'e'
            },
            margin: 2
        })

        grids.forEach(grid => {
            grid.on('change', function(event, items) {
                let newItems = []

                items.forEach ((el) => {
                    newItems.push({_id: el._id, x: el.x, y: el.y, w: el.w, task_id: el.id})
                });

                $wire.taskMoved(newItems)
            })
        })

        document.addEventListener('taskAdjusted', () => {
            console.info('HERE after taskAdjusted')
        })
    </script>
@endscript

Я начал экспериментировать с этим, используя следующий код: Он работает, каждый раз, когда я редактирую или добавляю задачу, я получаю журнал консоли, но я не уверен, что сюда поместить из API Gridstack, чтобы обновить $task. .

document.addEventListener('taskAdjusted', () => {
   console.info('HERE after taskAdjusted')
})

Я также пытался добавить wire:key = "project-{{$project->id}}" в $projects foreach и wire:key = "task-{{$task->id}}" в $tasks foreach, но это не сработало, поэтому я обнаружил, что wire:ignore в div работает лучше всего.

Это дополнительный вопрос к предыдущему вопросу, с которым вы, ребята, смогли мне помочь. Спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать события Livewire с JS следующим образом:

document.addEventListener('livewire:initialized', () => {
    Livewire.on('event-name'), () => {
        // Handle changed here
    });
});

Вы также можете отправлять события из Livewire в JS или даже с помощью Alpine, используя Livewire.dispatch('event-name'); или $wire.dispatch('event-name');.

Судя по всему, вы сможете использовать событие added.

grid.on('added', function(event: Event, items: GridStackNode[]) {
  items.forEach(function(item) {...});
});



Спасибо, хотя моя проблема оказалась совсем другой, ваш ответ помог мне направить меня на правильный путь.

dfeva 27.04.2024 02:38

Другие вопросы по теме