检查下划线模板中未定义的变量

checking for undefined variable in underscore template

本文关键字:未定义 变量 下划线 检查      更新时间:2023-09-26

我在模板中显示了libraryPrep对象的模态视图:

if (_.isUndefined(this.libraryPreps)) {
                this.$el.html(this.template({  }));
            } else {
                this.$el.html(this.template({ libraryPreps: this.libraryPreps.toJSON() }));
            }

else语句在我有一个libraryPreps对象时起作用。在我的模板中,我这样使用它:

<select id="libraryPreps" >
                    <%  if (!_.isUndefined(libraryPreps)) { %>
                    <% _.each(libraryPreps, function (libraryPrep) { %>
                    <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option>
                    <% }); %>
                    <% } %>
                </select>

当我没有一个libraryPreps对象,我没有得到我的模板来渲染,我得到一个错误在控制台上,libraryPreps是未定义的。我是否在模板中错误地检查未定义?我感觉我在我的主干模态视图中以同样的方式检查它,但出于某种原因,在我的实际模板中,它似乎不起作用。我的模板符号正确吗?谢谢。

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

相反,您必须使用typeof操作符,它甚至可以用于未声明的变量(请查看variable === undefined与typeof variable === "undefined"JavaScript检查变量是否存在(is defined/initialized)):
<select id="libraryPreps"><%
    if (typeof libraryPreps !== "undefined") {
        _.each(libraryPreps, function (libraryPrep) { %>
            <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option><%
        });
    }
%></select>

要在模板中使用_.isUndefined,您需要使该值在模板中显式可用。来自文档:

默认情况下,template通过with语句将数据中的值放在本地作用域中。但是,您可以使用variable设置指定单个变量名。这可以显著提高模板呈现的速度。

_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
=> "Using 'with': no"

因此,你可以这样写模板:

 <% if (!_.isUndefined(data.libraryPreps)) { %> …
 <% if ("libraryPreps" in data) { %> …

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

代替:if (typeof libraryPreps !== "undefined") {

使用:if (!_.isUndefined(obj.libraryPreps)) {

我知道这涉及到一个老线程。但是这个问题仍然存在。

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

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

对下划线v1.6.0进行了测试。稍加改动后,这个功能将会运行到1.9.1。再看看洛达什。这将与轻微的调整工作!

:

v1.6.0 rule: 1239

新版本规则:1575

旧代码:

if (escape) {
  source += "'+'n((__t=(" + escape + "))==null?'':_.escape(__t))+'n'";
}
if (interpolate) {
  source += "'+'n((__t=(" + interpolate + "))==null?'':__t)+'n'";
}
if (evaluate) {
  source += "';'n" + evaluate + "'n__p+='";
}

新代码:

if (escape) {
    source += "'+'n((typeof " + escape + " === '"undefined'" || " + escape + " === null) ? '"<%-" + (escape.toString()) + "%>'": _.escape(" + escape + "))+'n'";
}
if (interpolate) {
    source += "'+'n((typeof " + interpolate + " === '"undefined'" || " + interpolate + " === null) ? '"<%=" + (interpolate.toString()) +"%>'":" + interpolate + ")+'n'";
}
if (evaluate) {
    source += "';'n" + evaluate + "'n__p+='";
}