Hacer una variable opcional en plantilla de subscore.js
-
28-10-2019 - |
Pregunta
Tengo este código:
_.templateSettings = {interpolate : /\{\{(.+?)\}\}/g};
var _d = _.template($('#_d').html());
$.get('/foo', function(data) {
$('#output').html(_d(data));
});
y en html:
<div id="_d">
{{name}} {{phone}}
</div>
<div id="output"></div>
/foo
Devuelve algo como {"name":"joe","phone":"12345"}
, pero a veces no tiene phone
así simplemente regresa {"name":"joe"}
, que ahogará la evaluación de la plantilla, por lo que nada se imprime en output
. ¿Cómo hago una variable opcional?
EDITAR: /foo
está más allá de mi control
Solución
los ||
El operador es útil para este tipo de cosas:
$.get('/foo', function(data) {
data.phone = data.phone || "";
$('#output').html(_d(data));
});
Pero como ya estás usando un bajo, puedes usar el _.defaults
función. Este enfoque es particularmente útil para proporcionar valores predeterminados para múltiples campos:
$.get('/foo', function(data) {
_.defaults(data, {name : 'joe', phone : ''});
$('#output').html(_d(data));
});
Otros consejos
Me gustó la solución @Namuol, otra cosa que podríamos hacer es establecer el hash predeterminado en el modelo se extiende
var MyModel = Backbone.Model.extend({
defaults: {
"foo": "I",
"bar": "love",
"yeah": "sara"
}
});
Solo otra opción.
Puedes tener un HTML
<div id="d">
{{data.name}} {{data.phone}}
</div>
Use la plantilla a continuación para evitar un problema variable indefinido para phone
_.templateSettings = {
interpolate : /\{\{(.+?)\}\}/g
};
var template = _.template($('#d').html());
var jsonResponse = {"name":"Jeo"}; // phone is missing
var result = template({"data":jsonResponse});
Una solución práctica sería incluir phone
en el objeto, pero con un valor vacío:
{"name":"joe","phone":""}
Hay algunas buenas respuestas anteriores, pero puedes usar _.partial
Para obtener una sola función que aplique una plantilla con valores predeterminados:
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"
Y luego está lo obvio: ponlo en la parte superior de su plantilla:
<%
if (typeof(phone) === "undefined") {
phone = "";
}
%>
Fragmento de trabajo:
$(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>
(tambien como jsfiddle)