Паруса.js-как ввести JS-файл в определенный маршрут?
например, у меня есть страницы /locations/map
Что мне нужно включить Google Map библиотека, и включить .js(например, расположение.в JS) специально только для этой страницы.
Я хочу ввести эти 2 файла после <!--SCRIPTS END-->
эта строка
возможно ли это сделать?
Примечание: я использовал паруса.с JS версии v0.10
5 ответов
паруса использует ejs-locals
в своем представлении рендеринга, так что вы можете выполнить то, что вы хотите с блоками.
в своем , под <!--SCRIPTS END-->
добавить (например):
<%- blocks.localScripts %>
тогда в представлении вы служите в /locations/map
, вызовите блок с тегом скрипта, например:
<% block('localScripts', '<script src="https://maps.googleapis.com/maps/api/js"></script>') %>
в качестве альтернативы вы можете поставить <!--SCRIPTS-->
и <!--SCRIPTS END-->
теги в <head>
вашего макета, а затем добавьте свои скрипты для конкретного вида непосредственно в свой просмотр вместо использования блоков. Это прекрасный вариант, если вы не против подождать загрузки этих связанных скриптов до отображения содержимого страницы.
Скоттответ-это правильный способ вставки неглубоких JS в определенное представление. Просто небольшой комментарий, хотя:block
вызов из вида не должно быть тире. Должно быть так:
<% block('localScripts', '<script src="https://maps.googleapis.com/maps/api/js"></script>') %>
оба вызова будут работать, но использование тире делает вставку дважды; как только представление загружается и предшествует отрисовке макета, а затем еще раз, когда представление вставляется в отрисованный базовый макет. Это ведет не только вставлять / запускать излишне дважды один и тот же код, но и ошибки, которые нарушают ваш JS-код, если вставленный скрипт зависит от библиотек, которые у вас есть в базовом макете (например, jQuery, Backbone).
EJS интерпретирует магию <%-
Как "вставить без эскапады". Итак, -Я думаю - то, что это делает, называется block()
функция, которая возвращает наш HTML <script>
тег. Это заменяется там, где магия была вызвана, но также выполняет внутри него, который выполняет блок макета localScripts
замена.
С другой стороны, <%
означает "инструкция". То есть, просто запустите этот фрагмент кода JS, который не повторяется в представлении, где вызывается.
Я открываю для себя другой способ, чтобы сделать это
на MapController.js
// you can add as many as you like
res.locals.scripts = [
'//maps.googleapis.com/maps/api/js',
];
return res.view();
на макет.EJS по
<!--SCRIPTS-->
<!--SCRIPTS END-->
<!-- Loop through all scripts that passed from controller -->
<% if (scripts) { %>
<% for (i = 0; i < scripts.length; i++) { %>
<script src="<%- scripts[i] %>"></script>
<% } %>
<% } %>
Я знаю, что это старый вопрос, я обнаружил другой вариант.
:маршруты конфиг\.js
код:
'/': 'HomeController.StartHome'
Я StartHome:
api\контроллеры\HomeController.js
код:
StartHome: function(req, res) {
var template_data = {
"data" : {
"view_name" : "home_view"
}
}
res.view('home_view', template_data)
}
здесь, Я создал объект с некоторыми данными, который передается в шаблон EJS (клиенту).
:просмотров макет\.EJS по
код:
<% if (data["view_name"] === "home_view") { %>
<script src="script_for_home_view.js"></script>
<% } %>
в моих макетов.ejs я создал оператор if, который" включает " тег скрипта в зависимости от представления, на котором я сейчас нахожусь.
вот как я справляюсь с этим. Надеюсь, вам все ясно.
0.12.4 паруса
этот метод позволяет гибко локально обслуживать JS-файлы с любой страницы, а также предотвращать любые ошибки ссылок, вызванные зависимостями.
на .js вставить '!js / local/*.js в самом низу jsFilesToInject вот так:
var jsFilesToInject = [
// Load sails.io before everything else
'js/dependencies/sails.io.js',
// Dependencies like jQuery, or Angular are brought in here
'js/dependencies/jquery-3.3.1.min.js',
'js/dependencies/**/*.js',
// All of the rest of your client-side js files
// will be injected here in no particular order.
'js/**/*.js',
//Ignore local injected scripts
'!js/local/*.js'
];
создать местные внутри / активы / js папка ie / активы / js / local/. Поместите все локально введенные скрипты в здесь.
в вашем главном представлении EJS ie макет.EJS по вставить под блоком скриптов, как это:
<!--SCRIPTS-->
<script src="/js/dependencies/sails.io.js"></script>
<script src="/js/dependencies/jquery-3.3.1.min.js"></script>
<script src="/js/dependencies/bootstrap.min.js"></script>
<script src="/js/dependencies/popper.min.js"></script>
<!--SCRIPTS END-->
<%- blocks.localScripts %>
в вашем локальном представлении ejs (например. домашняя страница.ejs) вставьте свой localScripts блок такой:
<% block('localScripts', '<script src="/js/local/homepage.js"></script>') %>
паруса версии v0.12.14
редактировать это все еще актуально для парусов v1.0?
мой ответ категоричен:да и в моем предыдущем ответе мне не хватало объяснений, как получить максимальную отдачу от трубопровода Grunt, такого как clean, coffee, concat, uglify и т. д... при поступлении в производство.
трюк здесь состоит в том, чтобы сделать локальный файл (должен быть только один на странице) как можно меньше.
- группа и имя конкретных вызовов вашей функции
- сохранить функции в виде отдельных файлов для удобства обслуживания и сгруппировать их в папки.
- групповые привязки и любые инициализация глобальных переменных в пару функций, таких как
initThisPageVariables()
иinitThisPageBindings()
так что Ворчун может сжать их позже. - установите вызов главной функции для запуска приложения
startThisPageApp()
затем просто вызывая несколько функций из вашего локального (master) файла, чтобы получить вещи прокатки.
$(window).on('load', function(){
initThisPageVariables();
initThisPageBindings();
$(window).on("resize", function(){
initThisPageVariables();
}).resize();
startThisPageApp();
});