РЕДАКТИРОВАТЬ: этот ответ старый и устаревший. Я бы удалил его, но это "принятый" ответ. Вместо этого я выскажу свое мнение.
Я бы больше не выступал за это. Вместо этого я бы разделил все шаблоны на отдельные файлы HTML. Некоторые предлагают загружать их асинхронно (Require.js или своего рода кеш-шаблон). Это хорошо работает в небольших проектах, но в больших проектах с большим количеством шаблонов вы обнаруживаете, что делаете тонну небольших асинхронных запросов при загрузке страницы, что мне очень не нравится. (тьфу ... хорошо, вы можете обойти это с помощью Require.js, предварительно скомпилировав свои начальные зависимости с помощью r.js, но для шаблонов это все еще кажется мне неправильным)
Мне нравится использовать задачу grunt (grunt-contrib-jst) для компиляции всех HTML-шаблонов в один файл templates.js и включения его. Вы получаете лучшее из всех миров IMO ... шаблоны живут в файле, компиляция указанных шаблонов происходит во время сборки (а не во время выполнения), и у вас нет сотни крошечных асинхронных запросов при запуске страницы.
Все ниже - мусор
Лично я предпочитаю простоту включения JS-файла в мой шаблон. Итак, я мог бы создать файл с именем view_template.js, который включает шаблон в качестве переменной:
app.templates.view = " \
<h3>something code</h3> \
";
Затем это так же просто, как включить файл сценария, как обычный, а затем использовать его в своем представлении:
template: _.template(app.templates.view)
Сделав еще один шаг, я на самом деле использую coffeescript, поэтому мой код на самом деле выглядит примерно так и избегает escape-символов конца строки:
app.templates.view = '''
<h3>something code</h3>
'''
Использование этого подхода позволяет избежать добавления require.js туда, где в этом нет необходимости.
Вот простое решение:
Использование "async: false" здесь неплохой способ, потому что в любом случае вы должны дождаться загрузки шаблона.
Итак, функция "рендеринга"
[Я редактирую ответ вместо того, чтобы оставлять комментарий, потому что считаю это важным.]
если шаблоны не отображаются в собственном приложении , и вы видите
HIERARCHY_REQUEST_ERROR: DOM Exception 3
, посмотрите ответ Дэйва Робинсона на вопрос Что именно может вызвать ошибку "HIERARCHY_REQUEST_ERR: DOM Exception 3"? ,По сути, вы должны добавить
на запрос $ .ajax.
источник
dataType: 'html'
в наш запрос ajax, на всякий случай?Это Mixin позволяет оказывать внешний шаблон с помощью подчеркивания в очень простым способом:
_.templateFromUrl(url, [data], [settings])
. API метода почти такой же, как _.template () в Underscore . Кеширование включено.Использование:
источник
Я не хотел использовать require.js для этой простой задачи, поэтому использовал модифицированное решение koorchik.
Зачем добавлять шаблоны в документ, а не хранить их в объекте javascript? Поскольку в производственной версии я хотел бы создать html-файл со всеми уже включенными шаблонами, поэтому мне не нужно будет делать какие-либо дополнительные запросы ajax. И в то же время мне не нужно будет проводить рефакторинг в моем коде, поскольку я использую
в моих представлениях Backbone.
источник
async: false
устарелasync: false
устарело, я улучшил ответ, добавивcomplete
обратный вызов.Это может быть немного не по теме, но вы можете использовать Grunt (http://gruntjs.com/), который работает на node.js (http://nodejs.org/, доступен для всех основных платформ), чтобы запускать задачи из командная строка. Для этого инструмента существует множество плагинов, например, компилятор шаблонов, https://npmjs.org/package/grunt-contrib-jst . См. Документацию на GitHub, https://github.com/gruntjs/grunt-contrib-jst . (Вам также необходимо знать, как запустить диспетчер пакетов узлов, https://npmjs.org/ . Не волнуйтесь, это невероятно просто и универсально.)
Затем вы можете сохранить все свои шаблоны в отдельных html-файлах, запустить инструмент, чтобы предварительно скомпилировать их все, используя подчеркивание (которое, я считаю, является зависимостью для плагина JST, но не волнуйтесь, диспетчер пакетов узлов автоматически установит зависимости для вас).
Это компилирует все ваши шаблоны в один сценарий, скажем
При загрузке скрипта будет установлен глобальный - "JST" по умолчанию - который представляет собой массив функций, доступ к которому можно получить следующим образом:
JST['templates/listView.html']()
что было бы похоже на
если вы поместите содержимое этого тега скрипта в (templates /) listView.html
Однако настоящий кикер заключается в следующем: Grunt поставляется с этой задачей под названием `` смотреть '', которая в основном будет отслеживать изменения в файлах, которые вы определили в своем локальном файле grunt.js (который в основном является файлом конфигурации для вашего проекта Grunt в javascript ). Если у вас есть хрюканье, запустите эту задачу за вас, набрав:
из командной строки Grunt будет отслеживать все изменения, которые вы вносите в файлы, и автоматически выполнять все задачи, которые вы настроили для него в этом файле grunt.js, если он обнаруживает изменения - например, задача jst, описанная выше. Отредактируйте, а затем сохраните свои файлы, и все ваши шаблоны перекомпилируются в один файл js, даже если они разбросаны по нескольким каталогам и подкаталогам.
Аналогичные задачи могут быть настроены для линтинга вашего javascript, запуска тестов, объединения и уменьшения / уменьшения ваших файлов скриптов. И все это можно привязать к задаче наблюдения, поэтому изменения в ваших файлах автоматически запускают новую «сборку» вашего проекта.
Требуется некоторое время, чтобы все настроить и понять, как настроить файл grunt.js, но это хорошо, стоит потраченного времени, и я не думаю, что вы когда-нибудь вернетесь к способу работы с предварительным ворчанием.
источник
template: JST['test.html']()
похоже, он не загружает данные из JST :( (см. Мой вопрос здесь: stackoverflow.com/questions/29723392/… )Думаю, это может вам помочь. Все в решении вращается вокруг
require.js
библиотеки, которая представляет собой файл JavaScript и загрузчик модулей.Учебное пособие по ссылке выше очень хорошо показывает, как можно организовать магистральный проект. Также предоставляется образец реализации . Надеюсь это поможет.
источник
Я заинтересовался шаблонами javascript и теперь делаю первые шаги с магистралью. Это то, что я придумал, и, кажется, работает очень хорошо.
источник
get
функции я, вероятно, верну$.ajax
сам, чтобы он возвращал объект обещания, чтобы ваш шаблон не ответил сразу.Мне пришлось установить тип данных «текст», чтобы он работал у меня:
источник
Я нашел решение, которое мне подходит с использованием jQuery.
Я добавляю код шаблона подчеркивания с помощью метода jQuery.load () в основной файл html.
Как только он появится, я использую его для создания шаблонов. Все должно происходить синхронно!
Концепция:
У меня есть код шаблона карты подчеркивания:
И я поместил этот код в файл с именем map-template.html.
После этого я создаю оболочку для файлов шаблона.
Затем я включаю этот файл в свой основной файл html вот так.
В голове:
Приветствия.
источник
Я знаю, что этот вопрос действительно старый, но он появился как первый результат поиска в Google шаблонов подчеркивания ajax.
Я устал не находить для этого хорошего решения, поэтому создал свой:
https://github.com/ziad-saab/underscore-async-templates
Помимо загрузки шаблонов подчеркивания с помощью AJAX, он добавляет функциональность <% include%>. Надеюсь, это может быть кому-то полезно.
источник
Мне было немного сложно заставить jQuery работать синхронно, поэтому я изменил предыдущий синхронный пример, используя обещания. Это почти то же самое, но работает асинхронно. В этом примере я использую шаблоны hbs:
Затем использовать визуализированный html:
ПРИМЕЧАНИЕ. Как обсуждали другие, было бы предпочтительнее скомпилировать все шаблоны в один файл templates.js и загрузить его вначале, а не иметь множество небольших синхронных вызовов AJAX для получения шаблонов при загрузке веб-страницы.
источник
Предупреждение - вот драконы:
Я упоминаю о подходе, показанном ниже, просто для того, чтобы помочь тем, кто изо всех сил пытается заставить стеки ASP.NET (и аналогичные фреймворки) гармонично работать с экосистемой js-libs. Само собой разумеется, что это не универсальное решение. Было сказано, что ...
/ endforwardwarning
Если вы используете ASP.NET, вы можете экстернализовать свои шаблоны, просто разместив их внутри одного или нескольких собственных частичных представлений. Также внутри вашего .cshtml:
Внутри вашего template.cshtml:
И теперь вы можете использовать шаблон как обычно:
Надеюсь, этот неуловимо-очевидный подход поможет кому-то сэкономить час на головокружение.
источник