Backbone下划线模板在变量名称中不起作用

时间:2013-06-06 20:10:41

标签: templates underscore.js underscore.js-templating

我的骨干下划线模板不起作用。我从服务器获得了一个带有名称的变量返回 month-total。模板引擎将处理为两个变量的算术运算。 如何将此视为单个变量。 感谢

1 个答案:

答案 0 :(得分:1)

通过将模板转换为JavaScript函数,可以使用下划线模板。像<%= x %>这样的事情直接进入那个功能未被触及;然后该函数使用JavaScript的with来使对象中的键行为类似于局部变量。来自fine manual

  

默认情况下,模板会通过with语句将数据中的值放在本地范围内。

您可以使用已编译模板函数的source属性来查看JavaScript,如果我们使用<%= a-b %>这样的简单模板执行此操作,您就会明白为什么将其视为减法:

// Reformatted for readability
function(obj) {
    var __t,
        __p   = '',
        __j   = Array.prototype.join,
        print = function() { __p += __j.call(arguments, ''); };
    with(obj || {}) {
        __p += '\n    ' + ((__t = ( a-b )) == null ? '' : __t ) + '\n';
    }
    return __p;
}

演示:http://jsfiddle.net/ambiguous/6rPnB/

在那里,您可以看到with和原始a-b减法表达式。

现在您知道出了什么问题,您如何解决?立即出现三种可能性:

  1. 修复服务器以返回JSON中的"a_b": 6而不是"a-b": 6等更好的内容。
  2. 在加载JSON时,或者在将数据交给模板之前,将传入的JSON映射到更友好的东西。
  3. 使用(记录的)with设置绕过variable语句。
  4. 对于最后一个,您可以将模板修改为更像这样:

    <%= data['a-b'] %>
    

    使用以下内容编译模板:

    var t = _.template(template_text, undefined, { variable: 'data' });
    

    然后像往常一样调用编译模板函数。您不必使用data作为您的名字,只需确保模板和variable设置一致。

    演示:http://jsfiddle.net/ambiguous/eYn9m/