Выбранное решение состоит из нескольких частей и, как указано в diacode , с небольшими изменениями может быть применено в будущем Webpack в Фениксе> = 1.4.
Первое, что нужно указатьjs файл, который мы хотим загрузить, и для удобства мы называем его так же, как пара модуль-шаблон.
Имя создается в функции в layout_view.ex
и помещается в качестве атрибута в * 1008.* тег app.html.eex
примерно так:
<body data-js-view-name="<%= js_view_name(@view_module, @view_template) %>">
Затем app.js
несет ответственность за загрузку конкретных js для каждого шаблона, который мы поместили в assests/js/views
, и вызывает вызовфункция.
import loadView from './views/view_loader';
function handleDOMContentLoaded() {
//// Get the current view name
const viewName = document.getElementsByTagName('body')[0].dataset.jsViewName;
// Load view class and mount it
const ViewClass = loadView(viewName);
window.currentView = new ViewClass();
window.currentView.mount();
}
function handleDocumentUnload() {
window.currentView.unmount();
}
window.addEventListener('DOMContentLoaded', handleDOMContentLoaded, false);
window.addEventListener('unload', handleDocumentUnload, false);
Загрузчик представления:
import MainView from './main';
import RoomShowView from './room_show';
import UserShowView from './user_show';
// Collection of specific view modules
const views = {
"room_show": RoomShowView,
"user_show": UserShowView
};
export default function loadView(viewName) {
return views[viewName] || MainView;
}
на данный момент, вы должны импортировать представления (это изменится с Webpack)
структура каждого js-файла представляет собой пару функций mount
и unmount
(по умолчанию вызывающих родительский вид), в которые мы помещаем наш код.
import MainView from './main';
import socket from "../socket";
import {Presence} from "phoenix";
export default class View extends MainView {
mount() {
super.mount();
// the code
console.log('room-show mounted');
console.log('eex room.id: '+eex["@room.id"])
}
unmount() {
super.unmount();
// Specific logic here
console.log('room-show unmounted');
}
}
В шаблоне, который мы поместилипеременные, которые встраиваются с сервера в диктовке, что мыдоступ из динамически загруженного кода.
<script>
var eex = {
"@room.id": <%= @room.id %>,
"@current_user.name": "<%= @current_user.name %>",
"@current_user.id": <%= @current_user.id %>
}
</script>
Идея заключалась в том, чтобы использовать один канал только в одном шаблоне и поддерживать другой канал для общих целей всех шаблонов.Канал создается в app.js
, и вы можете push
, в любом другом шаблоне, я поместил его в main.js
Я опускаю код, так как он находится в ссылке, и я уверен,Вы видели это где-то еще.
Еще многое предстоит сделать, это незавершенный код.Но там есть на GitHub