我想知道当我的模板中没有定义变量时,是否有任何解决方案可以引发错误?
示例:
function hello() {
var data = { foo: 'hello' };
//data.bar is undefined, data.bar will be replaced by an empty string by underscore
var render = _.template('<p><%= data.foo %><%= data.bar %></p>', {data: data});
//Rendering okay? true|false
//if (render...)
}
如果在调用_.template函数之后没有定义变量data.boo,我想抛出一个错误。你知道是否有可能做这样的事情吗?不幸的是,我查看了文档,没有发现任何有趣的东西。。。
感谢
无论好坏,Undercore都会为您的顶级属性做这件事:
var data = { foo: 'hello' };
var rendered = _.template('<p><%= foo %><%= bar %></p>', data);
// throws ReferenceError: bar is not defined
这是因为Undercore模板使用with
,所以将顶级属性视为变量。如果你想在子对象属性上出现错误,你需要自己添加它,也许也可以使用with
:
var data = { foo: 'hello' };
// throw
var rendered = _.template('<% with (data) { %><p><%= foo %><%= bar %></p><% } %>',
{ data: data });
或者可以使用显式throw
,例如
<% if (data.bar === undefined) throw "No bar!"; %>
在模板的开头。但实际上,你为什么要这样做?如果你知道你在检查什么,最好通过显式的预渲染检查来完成,并在那里处理它,避免对控制流使用错误:
var rendered;
if (data.foo !== undefined) rendered = _.template("...", { data: data });
else {
// do something else
}
就像@mechanicalfish所说的,你试图做的似乎是不正确的。您应该验证模板之外的数据。无论哪种情况,以下都是您的要求:
function hello() {
var data = { foo: 'hello' };
//data.bar is undefined, data.bar will be replaced by an empty string by underscore
var render = _.template('<p><%= data.foo %><% ' +
' if (!data.bar) { ' +
' throw "data.bar is undefined" ' +
' } else { ' +
' print(data.bar) ' +
' } ' +
' %></p>', {data: data});
//Rendering okay? true|false
//if (render...)
}
JavaScript支持try/catch。
function hello() {
var data = { foo: 'hello' };
try {
//data.bar is undefined, data.bar will be replaced by an empty string by underscore
var render = _.template('<p><%= data.foo %><%= data.bar %></p>', {data: data});
} catch (e){
throw "data.bar is undefined";
}
}