Ошибка при загрузке шаблонов jsrender через AJAX

Я пытаюсь написать функцию для загрузки шаблонов во внешние файлы и использовать их с jsrender. Однако я получаю эту ошибку:

TypeError: elem.getAttribute is not a function
[Break On This Error]   

value = $templates[elem.getAttribute(tmplAttr)];

У меня есть несколько console.logs, показывающих, что шаблон был получен с помощью ajax.

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

var path    = 'templates/myTemplate.tmpl.html';
var data    = searchResultTeasers;
var target  = $('#results');

$.ajax({
    url     : path,
    aysnc   : false,
    success : function(template) {

        console.log("Path", path);
        console.log("Template", template);
        console.log("Data", data);

        //=============================================
        // Save Template with url as name for future
        //=============================================
        $.templates(path, template);

        //=============================================
        // Get Template String
        //=============================================
        var templateString  = $.templates(path);

        //=============================================
        // Render Template
        //=============================================
        renderedTemplate    = templateString.render(data);

        target.html(renderedTemplate);
    }
});

Ошибка в jsrender.js (строка 829), и я думаю, что это связано с $.templates(path); но я не понимаю, что может быть не так.

Вот ссылка на zip-файл проекта: http://sdrv.ms/QsZpQT

Я основывал свою функцию на этой статье: http://msdn.microsoft.com/en-us/magazine/hh975379.aspx

Я не уверен, что это вообще связано с jsRender, но это все еще мешает мне продолжать, и я был бы признателен за любую помощь.


person Matt Mazzola    schedule 22.09.2012    source источник
comment
Я предлагаю вам объяснить свою проблему здесь, не прося людей загрузить для вас ZIP-файл. Люди опасаются ссылок.   -  person rationalboss    schedule 22.09.2012
comment
если это абсолютно необходимо (что должно быть очень и очень редко), вы не должны устанавливать async: false для вызовов ajax (и вы также написали с ошибкой async).   -  person MrOBrian    schedule 24.09.2012


Ответы (2)


Итак, я сам столкнулся с этой же ошибкой (при попытке использовать внешние шаблоны с jsrender с дополнительным требованием загрузки локальных файлов (это означает, что я не использую какой-либо код на стороне сервера)).

К сожалению, статья MSDN, на которую вы ссылаетесь (и на которую я пошел изначально, прежде чем наткнуться на это), и принятый ответ на Сохраните шаблон jsRender в отдельном файле js, оба рекомендуют использовать $.get(), но вы должны использовать $.ajax() как для параметра async, так и для параметра dataType, т.к. поясняется ниже.

Вот как я заставил это работать:

  1. Использованы $.ajax() и async: false (что вы сделали в приведенном выше примере, за исключением того, что вы неправильно написали «async» как «aysnc»).
  2. Установите параметр dataType: 'text' для вызова ajax. Эта часть была ключевой — когда я пропустил параметр dataType, содержимое шаблона вернулось как [object XMLDocument], от которого $.templates подавился.

Итак, окончательный фрагмент кода, который в итоге заработал, выглядит так:

var file = 'views/my_template_file.html';
$.ajax({
    url: file,
    async: false,
    dataType: 'text',
    success: function(contents) {
        $.templates({my_template: contents});
        $('#myDiv').html(
            $.render.my_template()
        );
    }
});

Надеюсь, это поможет кому-то еще в будущем.

person Dmitri Zagidulin    schedule 29.11.2012
comment
Вы говорите в пункте 1 своего ответа, чтобы установить async: true, но ваш фрагмент кода показывает async: false. Я предполагаю, что async: false верно? Спасибо. - person Floris; 05.08.2014

Возможно, метод $.templates() изменился с момента написания упомянутой статьи msdn. Вы уже смотрели на Сохранение шаблона jsRender в отдельном файле js

person Fuwjax    schedule 18.10.2012