在_.template中加载一个html文件

时间:2013-10-19 13:10:34

标签: jquery ajax underscore.js

我正在尝试使用underscore.template以这种方式通过jQuery.get加载html来编译JavaScript模板:

_.template($.get('my_template.html'), $get(function(data) { 
    return data;
}));

但我收到以下消息

TypeError: Object #<Object> has no method 'replace'

任何提示?

1 个答案:

答案 0 :(得分:3)

$.get并不像您认为的那样工作。 $.get('my_template.html')没有返回my_template.html,它会返回jqXHR,您将获取的内容传递给$.get回调:

$.get('my_template.html', function(html) {
    // my_template.html will be in `html` here.
});

因此,如果您真的想使用$.get来检索模板,那么您将不得不等待AJAX​​调用从服务器返回一些内容并且直到稍后才会发生。您可以使用$.ajaxasync选项发出同步AJAX请求:

  

async (默认:true
  类型:布尔

  默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。 [...]请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。

看起来像这样:

var tmpl;
$.ajax({
    url: 'my_template.html',
    type: 'get',
    async: false,
    success: function(html) {
        tmpl = html;
    }
});
var t = _.template(tmpl);
// `t` is now your compiled template function

我不建议这样做,async:false对您的用户来说是一件令人讨厌的事情,使用它会让人们认为您的应用已被锁定或崩溃。

我会找到一种不同的加载模板的方法。将它们全部放在<script>个元素中,以便它们始终可用,或者将它们与任何将要使用它们的JavaScript一起提供。