2

我正在尝试编写一个函数来加载外部文件中的模板并将它们与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); 但我不明白可能出了什么问题。

这是项目压缩包的链接:http: //sdrv.ms/QsZpQT

我的功能基于这篇文章:http: //msdn.microsoft.com/en-us/magazine/hh975379.aspx

我不确定这是否与 jsRender 相关,但它仍然阻止我继续,我将不胜感激。

4

2 回答 2

3

所以我自己也遇到了同样的错误(当尝试将外部模板与 jsrender 一起使用时,还需要加载本地文件(也就是说,我没有使用任何服务器端代码))。

不幸的是,您链接到的 MSDN 文章(在偶然发现之前,我最初访问过)和将jsRender 模板存储在单独的 js 文件中的已接受答案,都建议使用 a $.get(),但您必须将$.ajax()两者都用于异步参数和 dataType 参数,如下所述。

这是我如何让它工作的:

  1. 使用$.ajax()and 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()
        );
    }
});

希望这对其他人有所帮助。

于 2012-11-29T22:56:49.453 回答
0

自从参考的 msdn 文章编写后,$.templates() 方法可能已更改。您是否已经看过将 jsRender 模板存储在单独的 js 文件中

于 2012-10-18T16:06:38.697 回答