Livewire прослушивает изменения событий из библиотеки JS

Я пытаюсь подключить библиотеку js, gridstack, с livewire/apline.js. К сожалению, в Интернете нет ресурсов о том, как заставить его работать с livewire. Я не очень хорошо знаком с js, поэтому я использую стек TALL для разработки, но после долгих исследований GridStack оказался для нас лучшим решением.

Может ли кто-нибудь указать мне правильное направление, как прослушивать события, предоставляемые js-библиотеками, чтобы я мог подключиться к livewire?

Это то, что у меня есть на данный момент, и моя интерактивная сетка загружается правильно. Мне нужно иметь возможность прослушивать изменения, которые происходят, когда элемент перемещается/изменяется в размере/перетаскивается, чтобы я мог сохранить его в серверной части с помощью livewire/laravel.

<div
    x-data = "{
        init() {
            let grid = GridStack.initAll({
                column: 6,
                cellHeight: '60px',
                cellWidth: '100px',
                float: false,
                resizable: {
                    handles: 'e'
                },
                margin: 2
            })
        }
    }"
  >
  <div class = "grid-stack">
     <div class = "grid-stack-item">
        <div class = "grid-stack-item-content">Item 1</div>
     </div>
     <div class = "grid-stack-item" gs-w = "2">
        <div class = "grid-stack-item-content">Item 2 wider</div>
     </div>
  </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
</div>

Это из API Gridstack , и я считаю, что это то, что мне нужно включить в свой код.

изменение (событие, предметы)

Происходит, когда виджеты меняют свое положение/размер из-за ограничений или прямых изменений.

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

Редактировать

Ultimetley Я пришел к этому из комментариев и отлично работает:

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

    grids.forEach(element => {
        element.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);
        });
    });
}
Поведение ключевого слова "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
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это зависит от необходимой вам информации, однако этот пример дает представление о том, что можно сделать:

Класс

namespace App\Livewire;

use Livewire\Component;

class GridStack extends Component
{
    public function setItems ($items)
    {
        dd ($items);
    }
}

Вид:

<div
    x-data = "{
        init() {
            let grid = GridStack.init({
                column: 6,
                cellHeight: '60px',
                cellWidth: '100px',
                float: false,
                resizable: {
                    handles: 'e'
                },
                margin: 2
            });

            grid.on('change', function(event, items) {

                let newItems = [];

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

                $wire.setItems(newItems);
            });
        }
    }"
>

    <div class = "grid-stack" wire:ignore>
        <div class = "grid-stack-item">
            <div class = "grid-stack-item-content">Item 1</div>
        </div>
        <div class = "grid-stack-item" gs-w = "2">
            <div class = "grid-stack-item-content">Item 2 wider</div>
        </div>
    </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
</div>

В функции init() секции Alpine устанавливается обработчик событий, он вызывает метод бэкенда через объект $wire

Это потому, что вы используете let = grid gridGridStack.initAll(), который возвращает массив, в моем примере я использовал let = grid GridStack.init(), который возвращает один объект.

TUPKAP 16.04.2024 00:06

Спасибо! Я вижу это сейчас. Мой пример кода в вопросе был упрощен, поэтому его можно читать. У меня есть несколько сеток на одной странице, которые имеют один и тот же макет сетки, поэтому я использовал initAll(). Каждый Div с классом «grid-stack» находится в файле @foreach. Данные, которые я получаю из вашего примера, — это именно то, что мне нужно, мне просто нужно реализовать их с помощью initAll, чтобы все загружалось правильно. В API-интерфейсе Gridstack есть это, возможно, мне нужно работать: «let Grids = GridStack.initAll(); Grids.forEach(...)»

dfeva 16.04.2024 01:07

forEach может быть жизнеспособным вариантом. Если мой ответ вам помог, вы можете принять его, чтобы закрыть вопрос.

TUPKAP 16.04.2024 01:56

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