【问题标题】:How to stock my Mustache / Handlebars templates in separate files?如何将我的 Mustache / Handlebars 模板存放在单独的文件中?
【发布时间】:2011-10-17 14:46:10
【问题描述】:

我在一个项目中使用handlebars.js,并且我开始拥有大量模板。 现在它们存储在我的主模板应用程序文件中,如下所示:

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

我想知道是否有办法将它们放在单独的文件中,例如 .js 文件或其他文件,以避免在我的源代码页面中堆叠它们。

我知道有几种解决方案可以通过 Ajax 调用这些模板,但这似乎会导致对我来说太多不必要的请求。

谢谢

【问题讨论】:

标签: javascript backbone.js mustache handlebars.js


【解决方案1】:

我创建并开源了NodeInterval,以解决我的 HTML 页面中太多 js 模板的完全相同的问题。

它允许您将所有模板放入以您喜欢的任何层次结构组织的模板文件夹中。它具有内置的watch 功能,因此当您修改任何这些模板时,它会自动更新您的 HTML 页面。我将它与 SASS 一起用于我的 CSS。

我每天都将它与下划线模板一起使用,但它也可以与 mustache 模板一起使用:

https://github.com/krunkosaurus/NodeInterval

【讨论】:

  • 老兄!我每天都使用 SASS,如果它像宣传的那样工作,我想我会喜欢它的 ^^ 有没有什么办法可以代替 html 文件输入一个带有预编译 js 模板的 js 文件?非常感谢
  • mdcarter:模板文件可以是任何格式,只要它们在其中的某处具有 id 属性即可。它按字母顺序对模板进行排序,然后将它们放入您的页面中。查看上面链接上的文档,它很好地解释了一切,如果没有,请告诉我。
  • 这太好了,谢谢!我只希望它也可以预编译它们。
【解决方案2】:

您不能只在模板中包含一个 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);

【讨论】:

  • 我可以,但这样做我失去了在我的模板中轻松使用单引号和双引号的能力。模板的自动编译也更难这种方式(现在我只是通过 jQuery 查找每个文本/html 标记并在启动时动态编译它们)
  • 您希望预编译您的模板吗?查看github.com/wycats/handlebars.js 并向下滚动到预编译模板。
【解决方案3】:

如果您使用的是 jquery,您可以创建一个 id 为“template-holder”的不可见 div

然后使用:

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

将html加载到div中 然后使用:

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

获取模板

:)

【讨论】:

  • 但他/她没有使用 jQuery……工具集在问题下方的标签中规定。很高兴您想提供帮助但尽量保持话题。 StackOverflow 上有很多 jQuery 特定的问题,将其强加在其他地方只会污染知识库。
  • @Emissary:我不认为不包含 jQuery 标签意味着他肯定没有使用它。
  • @ChrisDutrow 哇,老帖子……问题在公共领域——不仅仅是原始海报。 jQuery 在通常不必要的地方被过度使用,并且已经有数千个类似的问题明确针对 jQ 解决方案。当人们觉得有必要为非 jQ 问题发布 jQ 解决方案时,它只会给网站增加噪音/降低质量。
  • @Emissary - 对我来说,这也与原始海报无关。我相信他的回答很有帮助,希望看到更多类似的回答。
【解决方案4】:

我不熟悉handlebars.js,但是你试过吗?:

<script id="avatar_tpl" type="text/html" src="myscript.html"></script>

【讨论】:

  • 当然可以,但我正在寻找一种将多个模板“打包”到一个文件中的方法,以避免不必要的请求
  • 我正在寻找这样的方法,但上述方法似乎对我不起作用。 Chrome 说Resource interpreted as Script but transferred with MIME type text/html
  • 确实在 chrome 中不起作用,也许您可​​以导入一个包含您的 html 的 javascript 字符串变量,然后为该字符串分配一个 innerHTML。
【解决方案5】:

我现在已经为几个项目将我的所有脚本和模板滚动到一个大的 .js 文件中。我使用基于 java 的构建工具 ant 来连接和管理我的 js 的各种处理脚本。

在 javascript 变量中存储大型模板的最大问题是 javascript 缺少多行字符串。我通过使用类似 python 的三引号语法编写文件来处理这个问题:

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

然后我通过下面包含的 python 脚本运行这个自定义语法的 javascript 文件,将其转换为合法的 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 文件中。

【讨论】:

  • 如果您想尝试这些并需要帮助,请告诉我,我很乐意为您介绍更多细节。
  • 非常感谢摩根,也许我会这样做 =)
  • 看起来车把预编译可能是更好的方法。
【解决方案6】:

我创建了一个延迟加载 javascript 文件,该文件仅在需要时加载模板。它正在执行 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();
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多