Как мне инициализировать Flickity с HTML в Turbolinks - PullRequest
3 голосов
/ 29 апреля 2020

Я использую библиотеку Flickity .

Это мое HTML:

<section class="controls-inside controls-light p-0" data-flickity='{ "imagesLoaded": true, "wrapAround": true }'>

Хорошо работает при первой загрузке, которая создает это HTML:

<section class="controls-inside controls-light p-0 flickity-enabled is-draggable" data-flickity="{ "imagesLoaded": true, "wrapAround": true }" tabindex="0">

Но как только я перехожу на любую другую страницу и пытаюсь go вернуться на домашнюю страницу (где находится этот код), он генерирует только первый код вверху (то есть неинициализированный версия).

В настоящее время это мой TL код:

$(document).on("turbolinks:load", () => {
  $('[data-toggle="tooltip"]').tooltip()
  $('[data-toggle="popover"]').popover()
})

Итак, учитывая, что я использую инициализацию HTML, как мне справиться с этим с TL?

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

Я также открыт для инициализации Flickity с помощью JS, если он не был инициализирован с помощью HTML. В любом случае я в порядке, поэтому он работает.

Edit 2

В моем application.js у меня теперь есть следующее:

$(document).on("turbolinks:load", () => {
  var Flickity = require('flickity');
  var flkty = new Flickity( 'section[data-flickity]', {
      imagesLoaded: true,
      wrapAround: true,
  });
})

Это вроде работает. Что происходит, когда я пытаюсь перейти на другую страницу и go обратно на ту, на которой есть ползунок, я вижу, что он загружается дважды. Например, он загружает ползунок вначале, и я вижу его на полпути во время загрузки панели, вся страница снова обновляется. Чувствуется, что он делает вдвое больше работы. Я просто хочу, чтобы он загружался один раз.

Он также вызывает следующие ошибки в моей консоли браузера.

При первой загрузке страницы:

flickity.js:57 Uncaught TypeError: Cannot read property 'option' of undefined
    at new Flickity (flickity.js:57)
    at HTMLDocument.<anonymous> (application.js:43)
    at HTMLDocument.dispatch (jquery.js:4670)
    at HTMLDocument.elemData.handle (jquery.js:4490)
    at Object../node_modules/turbolinks/dist/turbolinks.js.e.dispatch (turbolinks.js:75)
    at r.notifyApplicationAfterPageLoad (turbolinks.js:994)
    at r.pageLoaded (turbolinks.js:948)
    at turbolinks.js:872
Flickity @ flickity.js:57
(anonymous) @ application.js:43
dispatch @ jquery.js:4670
elemData.handle @ jquery.js:4490
./node_modules/turbolinks/dist/turbolinks.js.e.dispatch @ turbolinks.js:75
r.notifyApplicationAfterPageLoad @ turbolinks.js:994
r.pageLoaded @ turbolinks.js:948
(anonymous) @ turbolinks.js:872
flickity.js:57 Uncaught TypeError: Cannot read property 'option' of undefined
    at new Flickity (flickity.js:57)
    at utils.js:217
    at Array.forEach (<anonymous>)
    at utils.js:201

Если я очищаю ошибки из моей консоли, перейдите в другое место и вернитесь назад, это единственная ошибка в моей консоли при загрузке второй страницы:

flickity.js:47 Bad element for Flickity: section[data-flickity]

Что может быть причиной этих ошибок и как их исправить?

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

В моем application.js я включил Flickity соответственно.

import '../src/flickity.pkgd.min'

Кроме того, мой package.json выглядит так:

{
  "name": "myapp",
  "private": true,
  "dependencies": {
    "@rails/actioncable": "^6.0.0",
    "@rails/actiontext": "^6.0.2-2",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "@rails/webpacker": "4.2.2",
    "bootstrap": "^4.4.1",
    "data-confirm-modal": "^1.6.2",
    "expose-loader": "^0.7.5",
    "flickity": "^2.2.1",
    "jquery": "^3.5.0",
    "local-time": "^2.1.0",
    "popper.js": "^1.16.1",
    "stimulus": "^1.1.1",
    "trix": "^1.0.0",
    "turbolinks": "^5.2.0"
  },
  "version": "0.1.0",
  "devDependencies": {
    "webpack-dev-server": "^3.10.3"
  }
}

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

Вот как выглядит мой application.js:

import '../src/flickity.pkgd.min'

$(document).on("turbolinks:load", () => {
  var Flickity = require('flickity');
  var flkty = new Flickity( 'section[data-flickity]', {
      imagesLoaded: true,
      wrapAround: true,
  });
})

Вот ошибка, которую я получаю при загрузке первой страницы в моей консоли JS.

first-load-errors-flickity

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

Все более или менее полностью исправлено, но я все еще вижу двойную перезагрузку всякий раз, когда я go возвращаюсь на страницу, которая ранее была загружена с помощью Flickity.

Например, рассмотрим следующий поток:

  • Go to home page ш ih Flickity (загрузить один раз)
  • Go до Article#New без Flickity (загрузить один раз, и Flickity не загружает или выдает JS ошибка при последнем обновлении).
  • Go вернуться к home page с помощью Flickity (он начинает загружаться и примерно на 1/4 или 1/3 пути через эту начальную страницу загружается, он выполняет полную страницу refre sh и загружает всю страницу). Ссылка на страницу sh заметна, потому что она происходит через 1-2 секунды после начала загрузки страницы.

Сначала я думал, что это потому, что я инициализирую Flickity дважды, то есть один раз с помощью JS. в ответе ниже и один раз через HTML примерно так:

<section id="featured-header" class="controls-inside controls-light p-0" data-flickity='{ "imagesLoaded": true, "wrapAround": true }'>

Поэтому я поменял местами селектор JS для id этого тега и удалил инициализацию HTML data-flickity, но это все еще делает то же самое поведение. то есть вместо этого я тестировал этот код:

<section id="featured-header" class="controls-inside controls-light p-0">

Так что это наводит меня на мысль, что это как-то связано с JS.

Кстати, кажется, что он на самом деле просто перезагружается что section[data-flickity] не обязательно вся страница. Он также не перезагружает любую другую страницу, когда я перемещаюсь по различным ссылкам. Это происходит только для элемента section[data-flickity].

1 Ответ

2 голосов
/ 01 мая 2020

Вы можете удалить файл JS, который у вас есть в каталоге src приложения, и установить его, используя NPM

npm install flickity

Затем, потребуется файл Flickity CSS в приложении . css

*= require flickity.css

Затем в вашем JS файле вы можете инициализировать Flickity на turbolinks:load, как вы сделали для всплывающей подсказки и всплывающего окна.

import Flickity from 'flickity';

$(document).on("turbolinks:load", () => {
    if($('section[data-flickity]').length > 0) {
        var flkty = new Flickity( 'section[data-flickity]', {
            imagesLoaded: true,
            wrapAround: true,
        });
    }
})
...