检查下划线模板中未定义的变量
checking for undefined variable in underscore template
我在模板中显示了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+='";
}
- Socket.IO未定义变量
- 更改 Javascript 对象中所有未定义变量的值
- coffeescript,类未定义变量
- 使用下划线未定义变量时发生抛出/捕获错误
- 网络浏览器正在成为“;严格的“;用于Javascript中未定义变量的操作
- 使用window.location时未定义变量
- 传递给数据的未定义变量
- bizzare未定义变量
- JavaScript 中全局范围内存在未定义变量的原因是什么?
- JavaScript onClick 参数表示未定义变量
- 在指令中使用 $scope.$watch 处理未定义变量的替代方法
- 对于循环错误:未捕获的引用错误,未定义变量.怎么了
- JavaScript / YouTube API - 未定义变量 YT
- 未捕获的引用错误:在测试真实性时未定义变量
- 通过使用JavaScript“未定义”(变量),我们可以释放系统内存
- 与未定义变量相关的错误
- Angularjs 控制器中的未定义变量
- 角度解析:未定义变量
- BackboneJS Uncaught ReferenceError:未定义变量
- 使用Underscore JS部分和for循环的未定义变量对象