Как хранить мои шаблоны усов/рулей в отдельных файлах?

Я использую handlebars.js в проекте, и у меня появляется достаточное количество шаблонов. На данный момент они хранятся в моем основном файле приложения-шаблона, например:

<script id="avatar_tpl" type="text/html">
bla bla bla {{var}} bla bla bla
</script>

Мне интересно, есть ли способ поместить их в отдельный файл, например файл .js или что-то в этом роде, чтобы избежать их нагромождения на моей странице исходного кода.

Я знаю, что есть несколько решений для вызова этих шаблонов через Ajax, но это, похоже, приводит к слишком большому количеству ненужных запросов для меня.

Спасибо


person mdcarter    schedule 17.10.2011    source источник
comment
github.com/leshill/handlebars_assets   -  person Saroj Yadav    schedule 27.07.2012


Ответы (6)


Я создал и открыл исходный код NodeInterval для этой же проблемы слишком большого количества шаблонов js на моей HTML-странице.

Это позволяет вам поместить все ваши шаблоны в папку шаблонов, организованную в любой иерархии, которая вам нравится. Он имеет встроенную функцию watch, так что при изменении любого из этих шаблонов он автоматически обновляет вашу HTML-страницу. Я использую его вместе с SASS для моего CSS.

Я использую его ежедневно с шаблонами подчеркивания, но он также должен хорошо работать с шаблонами усов:

https://github.com/krunkosaurus/NodeInterval

person Mauvis Ledford    schedule 21.10.2011
comment
Чувак ! Я использую SASS каждый день, и я думаю, что мне это понравится, если он будет работать так, как рекламируется ^^ Есть ли способ, которым вместо html-файла вы могли бы ввести js-файл с предварительно скомпилированными шаблонами js? Большое тебе спасибо - person mdcarter; 21.10.2011
comment
mdcarter: Файлы шаблонов могут быть в любом формате, если где-то в них есть свойство id. Он сортирует шаблоны в алфавитном порядке, а затем помещает их на вашу страницу. Ознакомьтесь с документацией по приведенной выше ссылке, она довольно хорошо все объясняет, а если нет, просто дайте мне знать. - person Mauvis Ledford; 21.10.2011
comment
Это здорово, спасибо! Я только хотел бы, чтобы он также мог предварительно скомпилировать их. - person Yossi Shasho; 13.03.2013

Не могли бы вы просто включить файл js с вашими шаблонами в качестве переменных js? Не проверял, просто подумал здесь:

//in your html page
<script id="avatar_tpl" type="text/html" src="mytemplates.js"></script>

// then in your mytemplates.js file
var template_1 = "{{ content }}";
var template_2 = "{{ content }}";

// and you could use it like this back in html page
var template1 = Handlebars.compile(template_1);
var template2 = Handlebars.compile(template_2);
person swatkins    schedule 17.10.2011
comment
Я мог бы да, но при этом я теряю возможность легко использовать одинарные и двойные кавычки в своих шаблонах. Кроме того, автоматическая компиляция шаблонов таким образом сложнее (сейчас я просто ищу каждую разметку text/html через jQuery и компилирую их на лету при запуске) - person mdcarter; 17.10.2011
comment
Вы бы предпочли предварительно скомпилировать свои шаблоны? Взгляните на github.com/wycats/handlebars.js и прокрутите вниз до раздела Предварительная компиляция шаблонов. . - person swatkins; 18.10.2011

если вы используете jquery, вы можете создать невидимый div с идентификатором «template-holder»

затем используйте:

$("#template-holder").load([url here])

чтобы загрузить html в div, используйте:

var templatestr = $("#template-holder").find("#avatar_tpl").html()

чтобы получить шаблон

:)

person Miao Siyu    schedule 06.10.2013
comment
Но он / она не использует jQuery ... набор инструментов указан в тегах под вопросом. Здорово, что вы хотите помочь, но старайтесь оставаться в теме. В StackOverflow есть множество вопросов, касающихся jQuery, и навязывание их в других местах только загрязняет базу знаний. - person Emissary; 06.10.2013
comment
@Emissary: ​​я не думаю, что отсутствие тега jQuery означает, что он определенно его не использует. - person Chris Dutrow; 06.03.2016
comment
@ChrisDutrow вау, старый пост ... вопрос находится в открытом доступе - речь идет не только об оригинальном плакате. jQuery чрезмерно используется там, где это часто не нужно, и уже есть тысячи подобных вопросов о SO, явно нацеленных на решения jQ. Когда люди чувствуют необходимость опубликовать решение jQ на вопрос, не относящийся к jQ, это просто добавляет шума на сайт / снижает качество. - person Emissary; 06.03.2016
comment
@Emissary - Для меня это тоже не оригинальный постер. Я считаю, что его ответ был полезным, и хотел бы видеть больше таких ответов. - person Chris Dutrow; 06.03.2016

Я не знаком с handlebars.js, но вы пробовали это?:

<script id="avatar_tpl" type="text/html" src="myscript.html"></script>
person Francisco Valdez    schedule 17.10.2011
comment
Ну, это, конечно, может сработать, но я ищу способ упаковать несколько шаблонов в один файл, чтобы избежать лишних запросов. - person mdcarter; 17.10.2011
comment
Я ищу такой подход, но вышеизложенное, похоже, не работает для меня. Хром говорит Resource interpreted as Script but transferred with MIME type text/html - person Daniel Buckmaster; 31.07.2012
comment
действительно не работает в chrome, возможно, вы можете импортировать строковую переменную javascript, содержащую ваш html, а затем назначить для этой строки innerHTML. - person Francisco Valdez; 01.08.2012

Сейчас я сворачиваю все свои скрипты и шаблоны в один большой файл .js для нескольких проектов. Я использую инструмент сборки на основе Java, ant, для объединения и управления различными сценариями обработки для моих js.

Самая большая проблема с хранением больших шаблонов в переменных javascript — это отсутствие в javascript многострочных строк. Я справляюсь с этим, записывая свои файлы с синтаксисом тройных кавычек, подобным Python:

var templateVariable = '''
   <div>
     <div></div>
   </div>
'''

Затем я запускаю этот файл javascript с пользовательским синтаксисом через приведенный ниже скрипт python, который превращает его в легальный javascript:

#!/usr/bin/env python
# encoding: utf-8
"""
untitled.py

Created by Morgan Packard on 2009-08-24.
Copyright (c) 2009 __MyCompanyName__. All rights reserved.
"""

import sys
import os


def main():
    f = open(sys.argv[1], 'r')
    contents = f.read()
    f.close

    split = contents.split("'''")

    print "split length: " + str(len(split)) 

    processed = ""

    for i in range(0, len(split)):
        chunk = split[i]
        if i % 2 == 1:
            processedChunk = ""
            for i,line in  enumerate(chunk.split("\n")):
                if i != 0:
                    processedChunk = processedChunk + "+ "
                processedChunk = processedChunk +  "\"" + line.strip().replace("\"", "\\\"").replace('\'', '\\\'') + "\"" + "\n"
            chunk = processedChunk
        processed = processed + chunk


    f = open(sys.argv[1], 'w')
    f.write(processed)
    f.close()


if __name__ == '__main__':
    main()

Работая таким образом, я могу кодировать шаблоны в более или менее чистом html и развертывать их вместе с кодом приложения в одном файле .js.

person morgancodes    schedule 17.10.2011
comment
Если вы хотите попробовать их и вам нужна помощь, дайте мне знать, и я буду рад рассказать вам больше деталей. - person morgancodes; 18.10.2011
comment
Большое спасибо morgan, может так и сделаю =) - person mdcarter; 18.10.2011
comment
Похоже, что предварительная компиляция руля, вероятно, лучший способ. - person morgancodes; 18.10.2011

Я создал файл javascript Lazy Load, который загружает шаблоны только по мере необходимости. Он выполняет вызовы AJAX, но, похоже, работает достаточно хорошо.

var Leuly = Leuly || {};

Leuly.TemplateManager = (function ($) {
    var my = {};

    my.Templates = {};

    my.BaseUrl = "/Templates/";

    my.Initialize = function (options) {
        /// <summary>
        /// Initializes any settings needed for the template manager to start.
        /// </summary>
        /// <param name="options">sets any optional parameters needed</param>

        if (options && options.BaseUrl) {
            my.BaseUrl = options.BaseUrl;
        }
    };

    my.GetTemplate = function (templateName, success, baseUrl) {
        /// <summary>
        /// makes a request to retrieve a particular template
        /// </summary>
        /// <param name="templateName">name of the template to retrieve</param>
        /// <param name="success">event returning the success</param>
        var template = my.Templates[templateName];

        if (template == null) {
            template = my.LoadTemplate(templateName, success, baseUrl);
        }
        else {
            success(template, true);
        }
    };

    my.LoadTemplate = function (templateName, success, baseUrl) {
        /// <summary>
        /// makes a request to load the template from the template source
        /// </summary>
        /// <param name="templateName">name of the template to retrieve</param>
        /// <param name="success">event returning the success</param>
        var root = baseUrl == null ? my.BaseUrl : baseUrl;
        $.get(root + templateName, function (result) {
            my.Templates[templateName] = result;

            if (result != null && success != null) {
                success(result, true);
            }
        });
    };

    return my;
} (jQuery));

$(function () {
    Leuly.TemplateManager.Initialize();
});
person uadrive    schedule 28.11.2013