忽略下划线模板中的未定义数据/变量

Sha*_*jad 17 javascript backbone.js underscore.js

仍然学习骨干所以忍受我;

我正在尝试将一个带有空白字段的新模型添加到视图中,但我创建的模板有很多

<input value="<%= some_value %>" type="whatever" />
Run Code Online (Sandbox Code Playgroud)

在获取数据时工作得非常好,它填充它并且一切顺利.当我想要创建一个新的(空白)渲染视图时会出现问题,它给了我

Uncaught ReferenceError: some_value is not defined
Run Code Online (Sandbox Code Playgroud)

我可以设置defaults(我已经为一些在db中有默认值的东西),但这意味着用空格键入40多个; 有没有更好的方法来处理这个?

我正在摆弄下划线模板本身,尝试类似<%= if(some_value != undefined){ some_value } %>但似乎有点麻烦.

jev*_*lio 24

将模板数据传递到包装器对象中.缺少属性访问不会抛出错误:

所以,而不是:

var template = _.template('<%= foo %><%= bar %>');
var model = {foo:'foo'};
var result = template(model); //-> Error
Run Code Online (Sandbox Code Playgroud)

尝试:

var template = _.template('<%= model.foo %><%= model.bar %>');
var model = {foo:'foo'};
var result = template({model:model}); //-> "foo"
Run Code Online (Sandbox Code Playgroud)

  • 如果您尝试访问model.foo.bar并且bar不存在,这仍然会失败 (2认同)

小智 12

实际上,您可以arguments在模板内部使用:

<% if(!_.isUndefined(arguments[0].foo)) { %>
       ...
<% } %>
Run Code Online (Sandbox Code Playgroud)

  • 是的,祝你好运在百万个地方 (8认同)

Ben*_*aum 10

没有,

由于下划线模板的实现方式,因此没有实际的解决方法.

看到关于它的讨论:

我担心这只是with(){}在JS中的工作方式.如果未声明变量,则为ReferenceError.我们无能为力,同时保留了其余的模板行为.

你可以完成你正在寻找的东西的唯一方法是用另一个对象包装对象,如建议的另一个答案,或设置默认值.


kir*_*gge 5

如果您检查生成的模板函数的源代码,您将看到如下内容:

with (obj||{}) {
  ...
  // model property is used as variable name
  ...
}
Run Code Online (Sandbox Code Playgroud)

在这里发生什么:首先JS试图找到你的财产在"目标文件",这是模型(更多关于语句).在"obj"范围中找不到此属性,因此JS遍历全局范围并最终抛出异常.

因此,您可以直接指定范围来修复:

<input value="<%= obj.some_value %>" type="whatever" />
Run Code Online (Sandbox Code Playgroud)

至少它对我有用.