Делаем переменную необязательной в шаблоне underscore.js - PullRequest
8 голосов
/ 09 сентября 2011

У меня есть этот код:

_.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 вне моего контроля

Ответы [ 6 ]

7 голосов
/ 09 сентября 2011

Оператор || полезен для такого рода вещей:

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

Но так как вы уже используете Underscore, вы можете использовать функцию _.defaults. Этот подход особенно полезен для предоставления значений по умолчанию для нескольких полей:

$.get('/foo', function(data) {
    _.defaults(data, {name : 'joe', phone : ''});
    $('#output').html(_d(data));
});
5 голосов
/ 18 декабря 2011

Мне понравилось решение @namuol, еще одна вещь, которую мы могли бы сделать, это установить хэш значений по умолчанию для расширений модели

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

Просто еще один вариант.

3 голосов
/ 08 марта 2013

Вы можете иметь 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});
1 голос
/ 10 июля 2017

И тут есть очевидное: поместите это в верхнюю часть вашего шаблона:

<%
  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 )

1 голос
/ 18 марта 2015

Есть несколько хороших ответов выше, но вы можете использовать _.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"
1 голос
/ 09 сентября 2011

Практическим решением было бы включить phone в объект, но с пустым значением:


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

...