Подтвердить что ты не робот

Sails.js - Как вставить файл js в определенный маршрут?

Например, у меня есть страница /locations/map, в которую мне нужно включить Google Map, и включить .js (например, location.js) специально для этой страницы.

Я хочу добавить эти 2 файла после <!--SCRIPTS END--> этой строки

Можно ли это сделать?

ПРИМЕЧАНИЕ. Я использовал Sails.js v0.10

4b9b3361

Ответ 1

Sails использует ejs-locals в рендеринге представления, поэтому вы можете выполнить то, что хотите, с блоками.

В вашем layout.ejs файле под <!--SCRIPTS END--> добавьте (например):

<%- blocks.localScripts %>

Затем в представлении, которое вы показываете в /locations/map, вызовите блок с тегом script, например:

<% block('localScripts', '<script src="https://maps.googleapis.com/maps/api/js"></script>') %>

В качестве альтернативы вы можете поместить теги <!--SCRIPTS--> и <!--SCRIPTS END--> в <head> вашего макета, а затем добавить свои сценарии, специфичные для просмотра, непосредственно в свое представление, а не использовать блоки. Это прекрасный вариант, если вы не возражаете ждать, когда эти связанные скрипты будут загружены до отображения содержимого вашей страницы.

Ответ 2

Scott answer - это правильный способ вставить неглобальный JS в конкретное представление. Просто небольшой комментарий, хотя: вызов block из представления не должен иметь тире. Он должен быть следующим:

<% block('localScripts', '<script src="https://maps.googleapis.com/maps/api/js"></script>') %>

Оба вызова будут работать, но использование тире делает вставку дважды; после загрузки представления и предшествующего рендерингу макета, а затем снова, когда представление вставлено в рендерную базовую компоновку. Это приводит не только к тому, чтобы вставлять/запускать излишне дважды один и тот же код, но также и с ошибками, которые нарушают ваш JS-код, если вставленный script зависит от библиотек, которые у вас есть в вашем базовом макете (например, jQuery, Backbone).

EJS интерпретирует магию <%- как "insert unescaped". Итак, я думаю, что это делает вызов функции block(), которая возвращает наш тег HTML <script>. Это заменяется там, где было вызвано волшебство, но также выполняет внутри него функцию block(), которая выполняет замену блока localScripts.

С другой стороны, <% означает "инструкция". I.e., просто запустите этот фрагмент кода JS, который не отражается в представлении, где вызывается.

Ответ 3

Я открываю другой способ сделать это

В MapController.js

// you can add as many as you like
res.locals.scripts = [
  '//maps.googleapis.com/maps/api/js',
];
return res.view();

В layout.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>
    <% } %>
<% } %>

Ответ 4

Я знаю, что это старый вопрос, я обнаружил еще один вариант.

Файл:

конфигурации\routes.js

код:

'/': 'HomeController.StartHome'

Я установил функцию StartHome в HomeController, ответственную за управление маршрутом "/".

Файл:

апи\Контроллеры\HomeController.js

код:

StartHome: function(req, res) {

    var template_data = {
        "data" : {
            "view_name" : "home_view"
        }

    }

    res.view('home_view', template_data)
}

Здесь я создал объект с некоторыми данными, которые передаются в шаблон EJS (клиенту).

Файл:

вид\layout.ejs

код:

<% if (data["view_name"] === "home_view") { %>
<script src="script_for_home_view.js"></script>
<% } %>

В моем layouts.ejs я создал оператор if, который "включает" тэг script в зависимости от того, на котором я в настоящее время включен.

Вот как я справляюсь с этим. Надеюсь, вам это ясно.

Паруса 0.12.4