2011-10-17 71 views
15

我在一个项目上使用handlebars.js,我开始有相当数量的模板。 现在它们存储在我的主模板的应用程序文件,如:如何将我的胡须/把手模板储存在单独的文件中?

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

我不知道是否有把他们像一个.js文件或东西的单独文件的方式,以避免堆积他们在我的源代码页。

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

谢谢

+0

https://github.com/leshill/handlebars_assets –

回答

8

我创建并开源了NodeInterval,因为我的HTML页面中存在太多js模板的问题。

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

我每天都使用它与下划线的模板,但它应该工作的罚款与胡子模板,以及:

https://github.com/krunkosaurus/NodeInterval

+0

伙计! 我每天都使用SASS,我想我会喜欢这个,如果它的广告^^ 有没有什么办法,而不是HTML文件,你可以输入一个js文件与预先编译的js模板呢? 非常感谢 – mdcarter

+0

mdcarter:模板文件的格式可以是任何格式,只要它们在其中某处具有id属性即可。它按字母顺序排列模板,然后将它们放入您的页面。查看上面链接的文档,它可以很好地解释所有内容,如果没有,请告诉我。 –

+0

这太好了,谢谢!我只希望它也可以预编译它们。 –

1

我不熟悉handlebars.js但是,你有没有尝试过这个?:

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

那么这可以工作,当然,但我正在寻找一种方法来“包装”几个模板成一个文件,以避免不必要的请求 – mdcarter

+1

我米寻找这样的方法,但上述似乎并没有为我工作。 Chrome说'资源解释为脚本,但使用MIME类型text/html传输' –

+0

在Chrome中确实不起作用,也许您可​​以导入包含您的html的javascript字符串变量,然后为该字符串分配一个innerHTML。 –

4

你不能只包括与您的模板作为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); 
+3

我可以,但这样做我失去了在我的模板中轻松使用单引号和双引号的能力。 此外,模板的自动编译更困难(现在我只是通过jQuery查找每个文本/ html标记,并在启动时即时编译它们) – mdcarter

+1

您是否希望预编译模板?看看https://github.com/wycats/handlebars.js/并向下滚动到预编译模板。 – swatkins

+0

老兄,这是伟大的,也许我可以使用它,谢谢=) – mdcarter

1

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

将大型模板存储在javascript变量中的最大问题是javascript缺少多行字符串。我处理这个写有蟒蛇般的三引号语法我的文件:

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文件里面。

+1

如果您想尝试这些并需要帮助,请告诉我,我很乐意为您介绍更多具体细节。 – morgancodes

+0

非常感谢你摩根,也许我会这样做是的=) – mdcarter

+0

看起来像把手预编译可能是一个更好的方式去。 – morgancodes

3

如果你正在使用jQuery,您可以用ID“模板支架”创建一个不可见的div

然后使用:

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

到HTML加载到DIV 然后使用方法:

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

得到

:)

+0

但他/她没有使用jQuery ...该工具集是在问题底下的标签中规定的。你很想帮忙,但是试着留在话题上。在StackOverflow中有很多关于jQuery的具体问题,将它强加于别处只会污染知识库。 – Emissary

+0

@使者:我不认为不包括jQuery标签意味着他绝对不会使用它。 –

+0

@ChrisDutrow哇,旧帖子...问题在公共领域 - 这不仅仅是原始的海报。 jQuery被滥用的地方经常是不必要的,并且已经有数千个类似的问题在SO上明确地针对jQ解决方案。当人们觉得需要将jQ解决方案发布到非jQ问题时,它只会增加网站的噪音/稀释质量。 – Emissary

0

我创建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(); 
}); 
相关问题