Javascript 检查下划线模板中是否存在未定义的变量

Javascript 检查下划线模板中是否存在未定义的变量,javascript,underscore.js,Javascript,Underscore.js,我在模板中显示libraryPrep对象的模式视图,如下所示: if (_.isUndefined(this.libraryPreps)) { this.$el.html(this.template({ })); } else { this.$el.html(this.template({ libraryPreps: this.libraryPreps.toJSON() })); }

我在模板中显示libraryPrep对象的模式视图,如下所示:

if (_.isUndefined(this.libraryPreps)) {
                this.$el.html(this.template({  }));
            } else {
                this.$el.html(this.template({ libraryPreps: this.libraryPreps.toJSON() }));
            }
<select id="libraryPreps" >
                    <%  if (!_.isUndefined(libraryPreps)) { %>
                    <% _.each(libraryPreps, function (libraryPrep) { %>
                    <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option>
                    <% }); %>
                    <% } %>
                </select>
 <% if (!_.isUndefined(data.libraryPreps)) { %> …
 <% if ("libraryPreps" in data) { %> …
else语句在我有libraryPreps对象时有效。在我的模板中,我是这样使用它的:

if (_.isUndefined(this.libraryPreps)) {
                this.$el.html(this.template({  }));
            } else {
                this.$el.html(this.template({ libraryPreps: this.libraryPreps.toJSON() }));
            }
<select id="libraryPreps" >
                    <%  if (!_.isUndefined(libraryPreps)) { %>
                    <% _.each(libraryPreps, function (libraryPrep) { %>
                    <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option>
                    <% }); %>
                    <% } %>
                </select>
 <% if (!_.isUndefined(data.libraryPreps)) { %> …
 <% if ("libraryPreps" in data) { %> …


当我没有libraryPreps对象时,我无法获取要渲染的模板,并且控制台上出现一个错误,即libraryPreps未定义。我是否检查模板中未正确定义的内容?我觉得我在主干模式视图中以同样的方式检查它,但由于某种原因,在我的实际模板中,它似乎不起作用。我的模板符号正确吗?谢谢。

如果要将变量传递给函数,它将被求值,并将抛出错误,因为没有这样的变量。相反,在主干视图中,您访问的是一个始终有效的对象的属性(如果不存在具有该名称的属性,则返回
undefined
值)

相反,您必须在其上使用
typeof
运算符,该运算符甚至适用于未声明的变量(请查看和):

因此,您可以这样编写模板:

if (_.isUndefined(this.libraryPreps)) {
                this.$el.html(this.template({  }));
            } else {
                this.$el.html(this.template({ libraryPreps: this.libraryPreps.toJSON() }));
            }
<select id="libraryPreps" >
                    <%  if (!_.isUndefined(libraryPreps)) { %>
                    <% _.each(libraryPreps, function (libraryPrep) { %>
                    <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option>
                    <% }); %>
                    <% } %>
                </select>
 <% if (!_.isUndefined(data.libraryPreps)) { %> …
 <% if ("libraryPreps" in data) { %> …
…
…

我遇到了类似的问题,我找到了以下解决方案:

而不是:
if(typeof libraryPreps!=“undefined”){


用法:
如果(!\u.isUndefined(obj.libraryPreps)){

我知道这涉及到一个旧线程。但此问题仍然处于活动状态

我已经为自己的堆栈创建了一个解决方案。可能对其他程序员有用

此代码检查变量是否未定义或为null。如果变量未定义或为null,则返回变量名。(使用模板语法)

此更改针对下划线JS v1.6.0进行了测试。如果有小的更改,则将适用于1.9.1。进一步查看Lodash。这将适用于小的调整

在下划线的开发版本中:

v1.6.0规则:1239

更新版本规则:1575

旧代码:

if(转义){
source+=“'+\n((“+escape+”)==null?“”:“:”escape(“+escape+”)+\n';
}
if(插值){
source+=“'+\n((“+interpolate+”)==null?“:+\t)+\n';
}
如果(评估){
source+=“;\n”+evaluate+“\n_up+=”;
}