Как кешировать шаблоны усов? - PullRequest
15 голосов
/ 09 июня 2011

Я бы хотел кешировать mustache шаблонов.

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

<script id="mustache-template" type="text/html">
<h1>{{title}}</h1>
</script>

И назовите тех, у кого есть JavaScript, например:

var html, template, data;
data = {  
    title : "Some title"
}; 
template = document.getElementById('mustache-template').innerHTML;
html = Mustache.to_html(template, data);

Это не будет кэшировать шаблоны. Единственный способ выяснить, это использовать теги-ссылки, но как мне вызвать содержимое шаблона через javascript без запроса ajax?

Это не сработает (конечно) ...

HTML

<link type="text/html" href="/mustache/template.tpl" id="mustache-template" />

Javascript

document.getElementById('mustache-template').innerHTML;

Ответы [ 3 ]

8 голосов
/ 10 июня 2011

Этот вопрос очень интересный!У меня была такая же проблема несколько месяцев назад, когда я начал использовать усы для «огромного» внешнего шаблона в проекте rails.

Я получил следующее решение ...


Шаблоны усов находятся в общей папке:

/public/templates/_template_name.tpl

Всякий раз, когда мне нужен шаблон, у меня есть этот помощник getTemplate , который делает некоторые вещи (есть некоторые mootools,но есть и комментарии):

// namespace.templatesCache is an object ( {} ) defined inside the main app js file

var 
    needXHR = false, // for callback function
    templateHTML = ""; //template html

if(!(templateHTML = namespace.templatesCache[template_name])){ //if template is not cached

    templateHTML = (this.helpers.supportLocalStorage) ? localStorage.getItem(template_name) : ""; //if browser supports local storage, check if I can retrieve it

    if(templateHTML === "" || templateHTML === null){ // if I don't have a template (usually, first time), retrieve it by ajax

      needXHR = true;  

      new Request.HTML({ //or jQuery's $.get( url /*, etc */ ) 

          url: namespace.URLS.BASE+"templates/_"+template_name+".tpl", // url of the template file

          onSuccess : function(t, e, html, js){

                namespace.templatesCache[template_name] = html; //cache it

                if(_this.helpers.supportLocalStorage){ //and store it inside local storage, if available
                  localStorage.setItem(template_name,html); 
                }

                //call callback      
          }
      }).get();

    }else{ //retrieved by localStorage, let's cache it

        namespace.templatesCache[template_name] = templateHTML;

    }

}

if(!needXHR){ // I retrieved template by cache/localstorage, not by Ajax

    //call callback    

}

, и я вызываю этого помощника следующим образом:

namespace.helpers.getTemplate('template_name', function( templateHTML ){
    // the callback function
});

Вы можете заметить, что в первый раз пользователь нуждается в шаблоне, есть асинхронный запрос (Вы могли бы сделать запрос на синхронизацию, если вы не хотите помещать какой-то другой код в обратный вызов)

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

1 голос
/ 05 августа 2012

То, что вы говорите, конечно, не будет работать, потому что атрибут innerHTML элемента liknek не даст вам содержимое ссылки.

Вы можете использовать Chevron для загрузки внешних шаблонов по таким ссылкам:

Вы добавляете в свой шаблон ссылку на файл шаблона:

<link href="path/to/template.mustache" rel="template" id="templateName"/>

Затем в вашем JS вы можете отрендерить свой шаблон так:

$("#templateName").Chevron("render", {name: "Slim Shady"}, function(result){
    // do something with 'result'
    // 'result' will contain the result of rendering the template
    // (in this case 'result' will contain: My name is Slim Shady)
});

Документы Chevron приведут больше примеров

1 голос
/ 09 июня 2011

Вы можете попытаться загрузить свой шаблон в iframe, который содержит HTML-страницу (которая будет кэшироваться) со всеми вашими script тегами внутри.

Затем вы можете прочитать их с главной страницыили вставьте их из iframe в окно parent.

Это то, что я делаю при использовании pure.js templates

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...