Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Rails + jQuery navigation

#jquery #ruby_on_rails


Есть сайт на рельсах и навигация по сайту полностью на jquery без перезагрузки страниц(не
знаю хорошо это или плохо). Все работает, но не так как хотелось бы, код я писал по
мере изучения самого языка. 
Есть меню(заказы, магазин..) с активным "remote: true"

link_to order_index_path, remote: true
link_to shop_index_path, remote: true


... или тоже самое, но в цикле:

- menu.each do |m|
    - if ((m.parent == 0) && (can? :read, m.access.constantize))
      = link_to eval(m.link), remote: true do
        .menu-btn = m.title


В каждом "index.js" присутствует определенный jQuery(ajax) код:

$("#main_content").html("<%= j (render 'index') %>")
...
   $(#somebutton).click(function(){
      console.log('help')
   })
...


Если я перехожу на нужную мне вкладку используя меню (link_to order_index_path, remote:
true), то все работает(логично что подключается index.js), но если перезагрузить страницу,
то jQuery код не работает. Мне приходится дублировать код и прописывать его в coffee
script или в application.js

Подобная ситуация встречается везде.

Например, мне нужно создать новый заказ, для этого я использую модальное окно (с
использованием "slide" эффекта) и когда заказ создан, то в  create.js отрисовывается
только сама таблица, а не index

<% if !@order.errors.empty? %>
...
<% else %>
  $(".panel .panel-body").html("<%= j (render "ordertable") %>")
  $("#product-modal").modal("hide")
<% end %>


Возвращаясь к началу, jQuery код с $(#somebutton).click в order_index_path после
срабатывания create.js так-же перестает работать. Далее в create.js мне снова приходится
дублировать то же самое действие.
И на выходе мы получаем дубликат уже в 3-х вьюхах: index.js, coffeescript(application.js)
и собственно в create.js(update.js)

Как быть? Как мне все это оптимизировать?

Обновление

Как я написал выше, все работает. Мне хочется оптимизировать код. Я не считаю правильным
копировать один и тот же эвент во все вьюхи, которые связаны с index-ами. Как же DRY?
При переходе по ссылке подгружается index.js, при перезагрузке страниц подгружается
coffee и application.js, но не используется index.js и наоборот. Можно как нибудь обойтись
например только coffee?
    


Ответы

Ответ 1



Есть сайт на рельсах и навигация по сайту полностью на jquery без перезагрузки страниц(не знаю хорошо это или плохо). Воспользуйтесь turbolinks для решения вашей задачи https://github.com/rails/turbolinks Статья на русском https://habrahabr.ru/post/167161/ Пример использования https://my100brands.com В качестве прелоадера я воспользовался плагином NProgress http://ricostacruz.com/nprogress/ application.coffee выглядит следующим образом: initDomPage = -> # исполнить код при начальной инициализации DOM дерева # Прелоадер для Ajax запросов $(document).ajaxSend -> NProgress.set(0.7).start() $(document).ajaxComplete -> NProgress.done() $(document).ajaxError -> NProgress.done() initPage = -> # исполнить код при обновлении страниц и начальной инициализации $(document).on 'ready', initPage $(document).on 'ready', initDomPage $(document).on 'page:load page:restore', initPage $(document).on 'page:before-change', -> NProgress.set(0.7).start() $(document).on 'page:change', -> NProgress.remove() NProgress.done()

Комментариев нет:

Отправить комментарий