2011-10-17 75 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(); 
}); 
相關問題