在underscore.js模板中使变量可选

时间:2011-09-09 17:07:44

标签: javascript templates underscore.js

我有这段代码:

_.templateSettings = {interpolate : /\{\{(.+?)\}\}/g};

var _d = _.template($('#_d').html());

$.get('/foo', function(data) {
    $('#output').html(_d(data));
});

并在HTML中:

<div id="_d">
    {{name}} {{phone}}
</div>
<div id="output"></div>

/foo返回类似{"name":"joe","phone":"12345"}的内容,但有时它没有phone,因此只返回{"name":"joe"},这将阻止模板评估,因此output不会打印任何内容1}}。如何使变量可选?

编辑: /foo无法控制

6 个答案:

答案 0 :(得分:7)

||运算符对于此类事情非常有用:

$.get('/foo', function(data) {
    data.phone = data.phone || "";
    $('#output').html(_d(data));
});

但由于您已经在使用下划线,因此您可以使用_.defaults功能。此方法对于为多个字段提供默认值特别有用:

$.get('/foo', function(data) {
    _.defaults(data, {name : 'joe', phone : ''});
    $('#output').html(_d(data));
});

答案 1 :(得分:5)

我喜欢@namuol解决方案,我们可以做的另一件事是在模型扩展中设置默认值哈希

var MyModel = Backbone.Model.extend({
    defaults: {
        "foo": "I",
        "bar": "love",
        "yeah": "sara"
    }
});

只是另一种选择。

答案 2 :(得分:3)

你可以有一个HTML

<div id="d">
    {{data.name}} {{data.phone}}
</div>

使用下面的模板来避免phone

的未定义变量问题
_.templateSettings = {
  interpolate : /\{\{(.+?)\}\}/g
};

var template = _.template($('#d').html());
var jsonResponse = {"name":"Jeo"}; // phone is missing
var result = template({"data":jsonResponse});

答案 3 :(得分:1)

一个实际的解决方案是在对象中包含phone,但值为空值:


{"name":"joe","phone":""}

答案 4 :(得分:1)

上面有一些很好的答案,但您可以使用_.partial来获取应用默认模板的单个函数:

foobarTemplate = _.template('<%=foo%><%=bar%>')
barPrefilled = _.partial(_.defaults, _, {bar:'def'})
foobarTemplate(barPrefilled({foo:'abc'}))
//  "abcdef"
foobarTemplateWithDefaults = function (data) {return foobarTemplate(barPrefilled(data));}
foobarTemplateWithDefaults({foo:'wat'})
//  "watdef"
foobarTemplateWithDefaults({foo:'foo', bar:'bar'})
//  "foobar"

答案 5 :(得分:1)

然后显而易见:将它放在模板的顶部:

<%
  if (typeof(phone) === "undefined") {
    phone = "";
  }
%>

工作片段:

$(function() {
  $('#result').html(
    _.template(
      $('#template').html(), {
        interpolate: /\{\{(.+?)\}\}/g
      }
    )({
      foo: 23,
      // No value for bar
      // bar: 11,
    },)
  )
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="x-template" id="template">
<%
  if (typeof(bar) === "undefined") {
    bar = "default";
  }
%>
This is {{ foo }} and {{ bar }}
</script>

<div id="result"></div>

(也作为jsfiddle