使用下划线未定义变量时发生抛出/捕获错误



我想知道当我的模板中没有定义变量时,是否有任何解决方案可以引发错误?

示例:

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";
    }

}

相关内容

最新更新