Custom JS требуется в Rails 6, но тогда ни одна из функций не работает - PullRequest
0 голосов
/ 20 февраля 2020

сводит меня с ума, потому что это должно быть так просто !!!

    // file: /app/javascript/packs/application.js
    require("jquery")
    require("custom/sites_manage")

    // file: /app/javascript/custom/sites_manage.js
    console.log(">>> this file is being loaded")
    function testFunc() {
      return "asdf"
    }

Когда я раскручиваю локальный сервер и go на домашнюю страницу, в консоли я вижу >>> this file is being loaded здорово ! Но потом, когда я звоню testFunc(), я получаю: Uncaught ReferenceError: testFunc is not defined

Почему ??? Я не думаю, что я делаю что-то отличное от многочисленных ответов / уроков по этой теме c (например, этот или этот )

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Поскольку вы используете веб-пакет, вам необходимо экспортировать свою функцию, чтобы другие файлы могли получить к ней доступ:

function testFunc() {
  return "asdf"
}
export default testFunc;

И использовать ее:

import testFunc from '../path/to/custom/sites_manage.js'
testFunc()
0 голосов
/ 24 февраля 2020

Эта проблема может быть вызвана двумя причинами:

Во-первых: файл js загружается в текущий iframe, но в недоступном контексте. Решение: просто под определение testFun c добавьте строку с window.publicTestFun c = testFunc; например:

function testFunc() {
  return "asdf";
}
window.publicTestFunc = testFunc;

Если проблема связана с контекстами, теперь вы можете вызывать publicTestFun c вне контекста.

Вторая причина: файл js загружается в iframe. В этом случае решить проблему немного сложнее и обмен сообщениями между iframe с событиями ondata или использование iframe url ha sh является единственным доступным механизмом связи ... поэтому обычно всегда лучше найти причину, почему это происходит (Мне нужна дополнительная информация, если это так).

Редактировать: возможна третья причина: файл js загружается как веб-работник ... веб-работники также изолированы контексты. Ситуация со связью аналогична сценарию iframe.

Однако, вероятно, причина кроется в первом, и с помощью window.publicfunction = privatefunction вы сможете вызывать свою функцию.

...