Храните шаблон jsRender в отдельном файле js - программирование
Подтвердить что ты не робот

Храните шаблон jsRender в отдельном файле js

Можно ли сохранить шаблон jsRender в отдельном файле?

Я хочу сохранить его в отдельном файле и сделать ссылку на него на моей странице.

что-то вроде этого

<script id="templateName" type="text/x-jsrender" src="thisIsTheTemplate.js"></script>

Я буду оценивать любые коммниты или предложения.

Спасибо

4b9b3361

Ответ 1

Да, вы можете это сделать (я использую это каждый раз).

предположим, что у вас есть ваши шаблоны в папке template и вызывается, например _productDetails.tmpl.html

на вашей странице вы используете jQuery $.get(), чтобы вытащить его и загрузить в шаблон, например:

var renderExternalTmpl = function(item) {

    var file = '../templates/_' + item.name + '.tmpl.html';
    $.when($.get(file))
     .done(function(tmplData) {
         $.templates({ tmpl: tmplData });
         $(item.selector).html($.render.tmpl(item.data));
     });    
}

и вы передаете объект item witch будет содержать все 3 свойства, например:

renderExternalTmpl({ name: 'productDetails', selector: '#items', data: {} })

У вас может быть класс утилит, чтобы сохранить все это:

var my = my || {};
my.utils = (function() {
    var getPath = function(name) {
        return '../templates/_' + name + '.tmpl.html';
    },
    renderExtTemplate = function(item) {

        var file = getPath( item.name );
        $.when($.get(file))
         .done(function(tmplData) {
             $.templates({ tmpl: tmplData });
             $(item.selector).html($.render.tmpl(item.data));
         });    
    };

    return {
        getPath: getPath,
        renderExtTemplate: renderExtTemplate
    };
});

и вы можете легко вызвать my.utils.renderExtTemplate(item);

Ответ 2

Недавно я столкнулся с этой проблемой. Просмотрев код jsRender и изучая другие библиотеки javascript, я решил написать свою собственную библиотеку, которая упростит загрузку внешних шаблонов, чтобы можно было прикрепить шаблоны к странице html с помощью тега <link> и сделать их просто включив. js файл. Если вы хотите проверить это, я отправил код на github с примерами:

https://github.com/stevenmhunt/tmpl.loader

Эта библиотека работает с jsRender, а также с любым кодом, способным обрабатывать шаблон.

Наслаждайтесь!

Ответ 3

Если вы пытаетесь загрузить внешние шаблоны из локального файла, как и я, позвольте мне сэкономить вам некоторое разочарование. Не используйте jQuery $.get(), как рекомендовано в ответе balexandre.

Используйте $.ajax() и установите async: true и dataType: text, в противном случае вы получите сообщение об ошибке: elem.getAttribute is not a function. Подробнее см. Мой ответ на Ошибка при загрузке шаблонов jsrender через AJAX.

Ответ 4

Вот функция, которую я написал для загрузки одного или нескольких внешних шаблонов сразу. Он также кэширует шаблоны, поэтому, если он уже загружен, он больше не загружается.

function loadTemplates() {
    var toLoad = [],
        loadAll = $.Deferred();

    $.each(arguments, function(i, templateName) {
        var filepath = '/path/to/templates/' + templateName + '.html',
            loadTemplate = $.Deferred();

        toLoad.push(loadTemplate);

        if ($.templates[templateName]) {
            loadTemplate.resolve();
        } else {
            $.get(filepath , function(html) {
                var newTemplate = {};
                newTemplate[templateName] = html;
                $.templates(newTemplate);
            }).fail(function() {
                throw 'Could not load template at '+filepath;
            }).done(function() {
                loadTemplate.resolve();
            });
        }
    })

    $.when.apply($, toLoad).done(function() {
        loadAll.resolve();
    });

    return loadAll;
}

Используйте его так:

loadTemplates('modal','itemDetail', 'itemsList').done(function() {
    // do stuff when all templates are loaded
    $('#viewItemDetail').on('click',function() {
        $.render.itemDetail({
            id:'123',
            name:'Cool Thing',
            description:'This thing is really cool.'
        });
    });
});

Ответ 5

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

<div id="all_template"></div>
<script>
var file = '/tmpl/all.tmpl.html';
$.ajax({
    url: file,
    async: false,
    type : "GET",
    dataType: 'text',
    cache: true,
    success: function(contents) 
    {
    $("#all_template").append(contents);//append all your template to the div
    }
});
</script>
<script>
var data = {};
$('#js-template').render(data);//use it as the same old way
</script>

таким образом, вам не нужно запрашивать файл ajax каждый раз, когда вы хотите отобразить шаблон js