У меня в фениксе следующая структура папок:
web/
static/
js/
app.js
script.js
socket.js
app.js имеет …
import socket from "./socket"
import script from "./script"
brunch-config.js имеет …
files: {
javascripts: {
joinTo: "js/app.js"
}
// ...
}
script.js имеет …
$('#some-button').on('click', function() {
connectToChannel(data);
});
socket.js имеет …
import {Socket} from "phoenix"
let socket = new Socket("ws://example.com/updates", {params: {"auth-token": "AUTH-TOKEN"}})
function connectToChannel(data) {
socket.connect()
let channel = socket.channel("updates:new", {})
channel.join()
.receive("ok", resp => { console.log("Joined successfully", resp) })
.receive("error", resp => { console.log("Unable to join", resp) })
channel.on("update", payload => {
console.log(payload);
})
}
export default socket
… но когда я нажимаю some-button, в консоли браузера появляется следующая ошибка:
Uncaught ReferenceError: connectToChannel не определен
Соединение будет успешным, если я возьму содержимое socket.js и помещу его в script.js, но я хотел бы сохранить их отдельно.
Функция
connectToChannelявляется локальной для файла, в котором она определена. Ниapi.js, ниscript.jsее не видят.Вы можете экспортировать его из
socket.jsи передать вapp.js, примерно так:И, наконец, оберните
script.jsв функцию, которая получаетconnectToChannel:Я получаю
Uncaught TypeError: (0 , _script2.default) is not a functionв строке вapp.js, где написаноscript(connectToChannel);иUncaught TypeError: connectToChannel is not a functionв строке, которую я вызываю эту функцию. — person benomatis; 30.03.2016Вы экспортировали эту функцию по умолчанию из
script.js? Вы экспортировалиexport {socket, connectToChannel}изsocket.js? Вероятно, вы что-то упустили, потому что это должно сработать. Я просто вставил эти три файла в пустое приложение для позднего завтрака, и оно работает. — person benomatis; 30.03.2016извините, где вы сказали в своем ответе, что я должен был экспортировать по умолчанию эту (какую?) функцию? — person benomatis; 30.03.2016
Я начинаю думать, что мне, вероятно, не хватает того, где и как
script(connectToChannel);должен использоваться … я просто добавляю его вapp.jsпосле того, как я импортировал? это не очень понятно, поскольку вы добавили код в один и тот же блок, а некоторые из них должны быть в разных файлах … — person benomatis; 30.03.2016Ага, это должно войти в
app.js. Мне не удалось разделить блок, но я добавил комментарий в блок, где начинаетсяapp.js. В последнем абзаце ответа также говорится, чтоscript.jsэкспортирует функцию, которая получаетconnectToChannel. Это один из способов добиться этого. Другой вариант — оставить script.js в основном как есть, но добавитьimport {connectToChannel} from "./socket"вверху — person benomatis; 30.03.2016хорошо, я мог бы заставить его работать, следуя вашему совету, большое спасибо за вашу помощь! — person benomatis; 30.03.2016