Rails: специфичный для страницы javascript, работающий на каждой странице, если посещен в том же окне - PullRequest
0 голосов
/ 18 сентября 2018

Я хотел запустить javascript для какой-то конкретной страницы.Для этого я создал метатег в файле макета следующим образом:

<%= tag :meta, name: :psj, action: action_name, controller: controller_name %>

Я также создал файл init.js, который будет загружен файлом манифеста приложения.

# init.js
var Page, bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
Page = (function() {
  function Page() {
    this.action = bind(this.action, this);
    this.controller = bind(this.controller, this);
  }
  Page.prototype.controller = function() {
    return $('meta[name=psj]').attr('controller');
  };
  Page.prototype.action = function() {
    return $('meta[name=psj]').attr('action');
  };
  return Page;
})();
this.page = new Page;

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

# scans.js
$(document).on('turbolinks:load', function() {
  if (!(page.controller() === 'scans' && page.action() === 'index')) { return; }

  var ajax_call = function() {
    $.get("/scans.js", { }, function(table) {
      $("#scans").replaceWith(table);
    });
  }

  var interval = 1000 * 60 * 1 ;
  setInterval(ajax_call, interval);
});

Это прекрасно работает для страницы scans#index.Теперь после посещения этой страницы, если я нажму на любую ссылку, которая загружает некоторую другую страницу в том же окне, , ajax_call запускается код, который не должен иметь место.

Наоборот, если я открываюэта другая страница в другом окне работает нормально (ajax_call не запускается).Это как-то связано с кешем браузера или кеша турболинков, не знаю, в чем причина проблемы.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Попробуй так:

document.addEventListener("turbolinks:load", function() {    
  let interval = null;
  if ((page.controller() === 'scans' && page.action() === 'index')) {
    let ajax_call = function() {
      $.get("/scans.js", { }, function(table) {
        $("#scans").replaceWith(table);
      });
    }
    let interval = 1000 * 60 * 1 ;
    interval = setInterval(ajax_call, interval);
  }else{
    if(interval){ clearInterval(interval) }
  }
}
0 голосов
/ 18 сентября 2018

Проблема, с которой вы столкнулись, заключается в том, что вы установили Turbolinks, но на самом деле вы не слушаете события смены страницы, чтобы манипулировать состоянием.Т.е., когда страница меняется, вам нужно очистить свой интервал.Turbolinks не обрабатывает браузер, открывающий новое окно и переходящий по URL-адресу (например, super + click), поэтому он работает в таких случаях.

...