【问题标题】:Making variable optional in underscore.js template在 underscore.js 模板中使变量可选
【发布时间】:2011-09-09 17:07:44
【问题描述】:

我有这个代码:

_.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 中不会打印任何内容。如何将变量设为可选?

编辑: /foo 超出我的控制范围

【问题讨论】:

  • 我认为你自己没有能力操纵/foo
  • @mblase75 谢谢,编辑了问题

标签: javascript templates underscore.js


【解决方案1】:

|| 运算符对这类事情很有用:

$.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));
});

【讨论】:

    【解决方案2】:

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

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

    只是另一种选择。

    【讨论】:

      【解决方案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});
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          上面有一些很好的答案,但是您可以使用_.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"
          

          【讨论】:

            【解决方案6】:

            然后很明显:把它放在模板的顶部:

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

            工作sn-p:

            $(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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多